在data.table中跳过NA

eks*_*oem 6 r data.table

我想使用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是空gNA

> DT[,.N, by=g]
    g N
1:  1 3
2:  2 5
3: NA NA
Run Code Online (Sandbox Code Playgroud)

我以为我可以访问g通过的值,.GRP但只提供组索引而不是值.是否有可能使计算以by变量的缺失状态为条件?

Uwe*_*Uwe 5

你可以尝试这个:

DT[, .N * NA^is.na(g), by = g]
Run Code Online (Sandbox Code Playgroud)
    g V1
1:  1  3
2:  2  5
3: NA NA
Run Code Online (Sandbox Code Playgroud)

它是Henrik if ... else ...条款的代数版本.它使用的事实NA^0返回1,而NA^1收益NAFALSETRUE可以强制转换为01,RESP.

如果要控制列名称:

DT[, .(n = .N * NA^is.na(g)), by = g]
Run Code Online (Sandbox Code Playgroud)
    g  n
1:  1  3
2:  2  5
3: NA NA
Run Code Online (Sandbox Code Playgroud)

或者,如果上面看起来很棘手,你可以使用data.table链接(感谢Sotos提出这个问题):

DT[, .N, by = g][is.na(g), N := NA][]
Run Code Online (Sandbox Code Playgroud)

这将改变N聚合后的值.