Ich denke Rote Bete ' Die obige Antwort ist eleganter, aber ich arbeitete an dem gleichen Problem und kam am selben Ort auf eine andere Weise an. Ich denke, es ist interessant, weil ich eine "Doppelschmelze" (yum!) Verwendet habe, um die x, y/p, q Paare auszurichten. Es zeigt auch tidyr::gather
anstelle von Schmelze.
library(tidyr)
x.df<- data.frame(Year=2001:2004,
x=runif(4,8,9),y=runif(4,8,9),
p=runif(4,3,9),q=runif(4,3,9))
x.df.melt<-gather(x.df,"item","item_val",-Year,-p,-q) %>%
group_by(item,Year) %>%
gather("comparison","comp_val",-Year,-item,-item_val) %>%
filter((item=="x" & comparison=="p")|(item=="y" & comparison=="q"))
> x.df.melt
# A tibble: 8 x 5
# Groups: item, Year [8]
Year item item_val comparison comp_val
<int> <chr> <dbl> <chr> <dbl>
1 2001 x 8.400538 p 5.540549
2 2002 x 8.169680 p 5.750010
3 2003 x 8.065042 p 8.821890
4 2004 x 8.311194 p 7.714197
5 2001 y 8.449290 q 5.471225
6 2002 y 8.266304 q 7.014389
7 2003 y 8.146879 q 7.298253
8 2004 y 8.960238 q 5.342702
Siehe unten für die grafische Darstellung.
Eine Schwäche dieses Ansatzes (und Rote-Beete-Verwendung von ifelse
) ist die filter
Anweisung wird schnell unhandlich, wenn Sie viele Paare zu vergleichen haben. In meinem Anwendungsfall habe ich die Performance der Investmentfonds mit einer Reihe von Benchmark-Indizes verglichen. Jeder Fonds hat eine andere Benchmark. Ich löste dies mit einer Tabelle von Metadaten, die die Fonds-Ticker mit ihren jeweiligen Benchmarks paaren, und dann left/right_join
verwenden. In diesem Fall:
#create meta data
pair_data<-data.frame(item=c("x","y"),comparison=c("p","q"))
#create comparison name for each item name
x.df.melt2<-x.df %>% gather("item","item_val",-Year) %>%
left_join(pair_data)
#join comparison data alongside item data
x.df.melt2<-x.df.melt2 %>%
select(Year,item,item_val) %>%
rename(comparison=item,comp_val=item_val) %>%
right_join(x.df.melt2,by=c("Year","comparison")) %>%
na.omit() %>%
group_by(item,Year)
ggplot(x.df.melt2,aes(Year,item_val,color="item"))+geom_line()+
geom_line(aes(y=comp_val,color="comp"))+
guides(col = guide_legend(title = NULL))+
ylab("Value")+
facet_grid(~item)
Da es keine Notwendigkeit für eine neue Gruppierung variabel ist, dass wir die Namen der Referenz item
s als Markierungen für das Facette Grundstück erhalten.
Neue Variable wird zum geschmolzenen Datenrahmen hinzugefügt? –
alles gute dank –