我的原始数据框如下所示:
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
答案 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]