两级聚合结果显示数字(0)

时间:2016-01-31 07:54:25

标签: r

我的原始数据框如下所示:

data <- data.frame(ID=c("AA","BB","BB","CC","CC"),TIME=c("T2","T1","T2","T1","T2"),X=rnorm(5,10,2.3),Y=rnorm(5,12,1.9)) 

data
  ID TIME         X        Y
1 AA   T2  9.309578 11.27739
2 BB   T1 10.434972 12.51784
3 BB   T2  8.535557 10.46360
4 CC   T1 11.305246 13.61831
5 CC   T2 10.325448 12.08844

然后我计算了两个级别之间的行差异。

Diff_test <- with(data, aggregate(data[,-(1:2)], by=list(ID), FUN=diff))

此处显示的结果。

 Group.1         X         Y
1      AA numeric(0)    numeric(0)        
2      BB -1.899415 -2.054241
3      CC -0.979798 -1.529876

第一行显示numeric(0)因为只存在一个时间段。我有什么办法可以为0结果分配值numeric(0)吗?结果就像是:

Group.1         X         Y
1      AA         0    0       
2      BB -1.899415 -2.054241
3      CC -0.979798 -1.529876

1 个答案:

答案 0 :(得分:0)

我们可以使用if/else条件为那些&#39; ID&#39;返回0只有一次观察。

 aggregate(data[,-(1:2)], by=list(ID=data$ID), 
      FUN=function(x) if(length(x)==1) 0 else diff(x))
 #  ID         X        Y
 #1 AA  0.000000  0.00000
 #2 BB -1.899415 -2.05424
 #3 CC -0.979798 -1.52987

使用dplyr的选项是

library(dplyr)
data %>%
    group_by(ID) %>%
    summarise_each(funs(if(n()==1) 0 else diff(.)), X:Y)
#     ID         X        Y
#  (chr)     (dbl)    (dbl)
#1    AA  0.000000  0.00000
#2    BB -1.899415 -2.05424
#3    CC -0.979798 -1.52987

data.table

library(data.table)
setDT(data)[,  lapply(.SD, function(x) if(.N==1) 0 else diff(x)) , 
                       by = ID, .SDcols=X:Y]