我有一个真正需要你帮助的问题:
set.seed(1111)
s<-rep(seq(1,4),5)
a<-runif(20,0.2,0.6)
b<-runif(20,0.4,0.7)
b[6:8]<-NA
c<-runif(20,4,7)
d<-data.table(s,a,b,c)
setkey(d,s)
数据如下:
s a b c
1: 1 0.3862011 0.4493240 6.793058
2: 1 0.4955267 0.4187441 4.708561
3: 1 0.4185155 0.5916827 6.810053
4: 1 0.5003833 0.5403744 5.948629
5: 1 0.5667312 0.5634135 6.880848
6: 2 0.3651699 0.5263655 5.721908
7: 2 0.5905308 NA 6.863213
8: 2 0.2560464 0.4649180 5.745656
9: 2 0.4533625 0.5077432 5.958526
10: 2 0.4228027 0.4340407 5.115065
11: 3 0.5628013 0.6517352 6.252962
12: 3 0.5519840 NA 4.875669
13: 3 0.2006761 0.6418540 5.452210
14: 3 0.5472671 0.4503713 6.962282
15: 3 0.5601675 0.5195013 6.666593
16: 4 0.2548422 0.6962112 5.535579
17: 4 0.2467137 NA 6.680080
18: 4 0.4995830 0.6793684 6.334579
19: 4 0.2637452 0.4078512 6.076039
20: 4 0.5063548 0.4055017 5.287291
如果我做一个简单的求和,使用s作为键,它将返回一个很好的表汇总结果:
d[,sum(c),by=s]
s V1
1: 1 31.14115
2: 2 29.40437
3: 3 30.20972
4: 4 29.91357
但是,如果我的data.table命令包含ifelse
语句,我将不会得到类似的表:
d2<-d[,ifelse(a<b,"NA",sum(c)),by=s]
d2
s V1
1: 1 NA
2: 1 31.1411493057385
3: 1 NA
4: 1 NA
5: 1 31.1411493057385
6: 2 NA
7: 2 NA
8: 2 NA
9: 2 NA
10: 2 NA
11: 3 NA
12: 3 NA
13: 3 NA
14: 3 30.2097161230631
15: 3 30.2097161230631
16: 4 NA
17: 4 NA
18: 4 NA
19: 4 NA
20: 4 29.9135677714366
是否可以使用ifelse
语句返回一个结果,就像简单的sum结果表一样,它返回每个索引值下的唯一非na值?
非常感谢!!!!!
答案 0 :(得分:3)
我不完全确定您要查找的内容,但我认为您只想将a<b
条件用作data.table
中的行选择器,这是通过将其用作第一个来完成的括号中的参数:
> d[a<b, sum(c), by = s]
s V1
1: 1 19.6
2: 2 22.5
3: 3 11.7
4: 4 17.9
答案 1 :(得分:0)
library(plyr)
ddply(d[a<b], .(s), summarize, tot=sum(c))
答案 2 :(得分:0)
基于使用which
的条件求和,有一个简单快速的解决方案:
d[, .( sum_c = sum(c[which( a < b)]) ), by=s]
# s sum_c
# 1: 1 19.552
# 2: 2 22.541
# 3: 3 11.705
# 4: 4 17.946
此结构相对于目前为止提供的其他答案的优势在于,它允许您使用不同的条件在同一调用中计算不同的聚合,例如:
d[, .( sum_c = sum(c[which( a < b)]),
sum_a = sum(c[which( c < 6)]) ), by=s]
# s sum_c sum_a
# 1: 1 19.552 10.657
# 2: 2 22.541 22.541
# 3: 3 11.705 10.328
# 4: 4 17.946 10.823
与similar question, here中的其他方法相比,此解决方案的速度有一个基准。