2014-12-03 53 views
1

我在前面的线程中寻找答案,但没有运气。 我想知道如果它可能是可能的,给定的数据帧具有类似于此dataframe2delta:如何使用ggplot2直接从数据帧绘制delta函数

df <- data.frame(x = rep(1:100, times = 2), 
       y = c(rnorm(100), rnorm(100, 10)), 
       group = rep(c("a", "b"), each = 100)) 

直接绘制的差的结构中,两个基团的观测之间,而不是使用不同标绘两个样品颜色,这是我使用ggplot2迄今能够做到的。当然,我知道我可以通过使用基本绘图系统,通过简单地使用

plot(df[df$group == "a",]$y - df[df$group == "b",]$y) 

但这样做,我浪费了ggplot2的所有酷功能。

在此先感谢!

EB

回答

0

使用dplyr另一种可能性是:

ggplot(df %>% group_by(x) %>% summarise(delta = diff(y)), 
     aes(x = x, y = delta)) + geom_line() 

在这种情况下,你可以使用函数diff,并假设各组之间的顺序避免dcast,否则你需要的因素进行排序或应用您的数据框上有dcast。我确信你可以使用data.table做一些非常相似的事情。

2

你可以尝试这样的事:

library(reshape2) 
library(ggplot2) 
df <- dcast(df, x~group, value.var='y') 
df$dif = df$a-df$b 
ggplot(df, aes(x, dif)) + geom_line() 

或者,如果您使用data.table这里是如何做到这一点:

library(data.table) 
dt=data.table(df) 
dt<-dcast.data.table(dt, x~group, value.var='y') 
dt[,dif:=a-b] 
ggplot(dt, aes(x, dif)) + geom_line() 

这个怎么样? enter image description here

+0

不错。你认为这是做这件事最直接的方法吗?使用plyr或dplyr可以做同样的事情吗? – Emiliano 2014-12-03 15:10:57

+0

我确定有办法使用'plyr'或'dplyr',但是我自己是'data.table'的用户。我编辑了我的答案也包括这种方法,但它不完全是你需要的。 – Nikos 2014-12-03 15:14:43

0

它没有彻底解决,但看起来接近我的意思是:

qplot(x = x, 
     y = diff, 
     data = dcast(data = df, 
        value.var = y, 
        formula = x ~ "diff", 
        fun.aggregate = function(x) x[1] - x[2]) 

这是相当棘手的,在很大程度上取决于你有你的group变量是什么,但工程。

另一种方法是改变dcast的输出,但在我的情况下,group列填写的值为TRUEFALSE值。因此,使用mutate获得diff=TRUE-FALSE返回了一列1,不是很有用。