通过data.table跳过NA值

6
我希望使用data.table,但如果by对应缺失值(NA),我想跳过j部分的计算:
以下是一个data.table的示例数据。
library(data.table)
DT <- data.table(y=10, g=c(1,1,1,2,2,2,2,2,NA,NA))

看起来像这样

> 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

现在我想在“g”上执行“by=”操作,第9行和第10行将被合并,因为它们具有相同的值“NA”。
> DT[,.N, by=g]
    g N
1:  1 3
2:  2 5
3: NA 2

我希望保留输出结果中的 NA 行,但希望在结果中跳过计算部分,即当 gNA 时,得到一个空的 N 输出结果。

> DT[,.N, by=g]
    g N
1:  1 3
2:  2 5
3: NA NA

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


3
你可以在 j 中访问你的分组变量的值。如果在 j 中使用它,它的长度为一(参见FAQ 2.10 Inside each group, why are the group variables length-1?)。因此,类似 DT[ , if(!is.na(g)) .(n = .N) else NA_integer_, by = g] 的语句就可以工作了。 - Henrik
4
еңЁiеҸӮж•°дёӯдҪҝз”Ё!is.na(g)иҝҮж»Өжңүд»Җд№Ҳй—®йўҳеҗ—пјҹеҚі DT[!is.na(g),.N, by=g]гҖӮиҜ·жіЁж„ҸдҝқжҢҒеҺҹж„ҸпјҢж¶ҰиүІиҜӯиЁҖд»ҘдҪҝе…¶жӣҙе®№жҳ“зҗҶи§ЈгҖӮ - Scott Ritchie
@ScottRitchie 我认为这将从结果中删除 NA 行。 但我仍希望在随后的连接中保留它。 - ekstroem
可能是data.table在by中不计算NA组的重复问题。 - smci
@scmi 可能会有重复,但是你链接的问题不是。原帖明确说明了我想在输出中保留NA行,而在你链接的问题中,NA组应该被完全跳过。 - Uwe
@scmi 当您所提到的问题在几个月前已被问过和回答了,那么我的问题如何成为重复的问题?哦,正如Uwe所提到的,我想保留NA - ekstroem
1个回答

7
您可以尝试这个:
DT[, .N * NA^is.na(g), by = g]
    g V1
1:  1  3
2:  2  5
3: NA NA
这是Henrik的代数版本的if ... else ...语句。它利用了NA^0返回1NA^1返回NA,以及FALSETRUE可以分别强制转换为01的事实。
如果您想控制列名:
DT[, .(n = .N * NA^is.na(g)), by = g]
    g  n
1:  1  3
2:  2  5
3: NA NA

或者,如果上面的方法看起来太麻烦,您可以使用data.table链接(感谢Sotos提出):

DT[, .N, by = g][is.na(g), N := NA][]

这将在聚合后更改 N 的值。

我怀疑[Frank对于重复数据表的回答在by操作中不计算NA组](https://dev59.com/Oanka4cB1Zd3GeqPV-2G#_b0ioYgBc1ULPQZFMW_t)更快且更清晰。 - smci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接