我想使用data.table但是j如果by对应于missing(NA),我想跳过部分的计算:
这是一个示例data.table
library(data.table)
DT <- data.table(y=10, g=c(1,1,1,2,2,2,2,2,NA,NA))
Run Code Online (Sandbox Code Playgroud)
看起来像这样
> DT
y g
1: 10 1
2: 10 1
3: 10 1
4: 10 2
5: 10 2
6: 10 2
7: 10 2
8: 10 2
9: 10 NA
10: 10 NA
Run Code Online (Sandbox Code Playgroud)
现在我想要by=打开g,并且两行9和10将被集中在一起,因为它们具有相同的值NA.
> DT[,.N, by=g]
g N
1: 1 3
2: 2 5
3: NA 2
Run Code Online (Sandbox Code Playgroud)
我想NA在输出中保留这一行,但是想跳过结果中的计算部分,即得到输出,当时N是空g的NA
> DT[,.N, by=g]
g N
1: 1 3
2: 2 5
3: NA NA
Run Code Online (Sandbox Code Playgroud)
我以为我可以访问g通过的值,.GRP但只提供组索引而不是值.是否有可能使计算以by变量的缺失状态为条件?
你可以尝试这个:
DT[, .N * NA^is.na(g), by = g]
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)g V1 1: 1 3 2: 2 5 3: NA NA
它是Henrik if ... else ...条款的代数版本.它使用的事实NA^0返回1,而NA^1收益NA和FALSE 和TRUE可以强制转换为0和1,RESP.
如果要控制列名称:
DT[, .(n = .N * NA^is.na(g)), by = g]
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)g n 1: 1 3 2: 2 5 3: NA NA
或者,如果上面看起来很棘手,你可以使用data.table链接(感谢Sotos提出这个问题):
DT[, .N, by = g][is.na(g), N := NA][]
Run Code Online (Sandbox Code Playgroud)
这将改变N聚合后的值.
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |