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

R 两级聚合结果显示数字(0),r,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

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

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
由于只存在一个时间级别,因此第一行显示的数值(0)。是否有任何方法可以将值
0
分配给
数值(0)
结果?因此,结果将是:

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

我们可以使用
if/else
条件为那些只有一个观察值的“ID”返回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

或使用
数据。表格

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

我们可以使用
if/else
条件为那些只有一个观察值的“ID”返回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

或使用
数据。表格

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