2017-02-21 23 views
2

我遇到了一个数据操纵问题。基本上我有两个因子列的数据帧和一个响应变量,如下所示:如何使用dplyr来计算一组行和目标行之间的差异?

set.seed(1234) 
df <- data.frame(ID = rep(1:10,each=4), 
       Condition = factor(rep(c("A","B","C","D"),10)), 
        Resp = runif(40,0,1)) 

我想什么来完成是创建一个新的列Resp_new其中对于每个ID,包括Resp的差在变量Condition的水平A与其余水平B,CD之间。

我想解决这个问题,dplyr,因为这是我的数据操作的主要工具,但任何帮助将高度赞赏。

回答

4

如果数据集按照示例进行排序,则可以在基本R中使用ave轻松完成此操作。

df$respNew <- ave(df$Resp, df$ID, FUN=function(i) i - i[1]) 

ave的第一个参数是要操纵的矢量,第二个参数是分组变量。第三个是在操作中使用的函数。这仅仅是第一个元素(ID == A)和矢量组的所有元素的区别。

前六行返回

head(df) 
    ID Condition  Resp respNew 
1 1   A 0.1137034 0.0000000 
2 1   B 0.6222994 0.5085960 
3 1   C 0.6092747 0.4955713 
4 1   D 0.6233794 0.5096760 
5 2   A 0.8609154 0.0000000 
6 2   B 0.6403106 -0.2206048 
+0

如果还是这个优秀的答案后,要dplyr :)。 df%>%mutate(respNew = ave(Resp,ID,FUN = function(i)i - i [1])) – thisisrg

+1

@thisisrg或者,只需输入令牌dplyr函数:)'df $ respNew < - df $ Resp - ave(df $ Resp,df $ ID,FUN = dplyr :: first)' – Frank

相关问题