r语言 - 在数据表中跳过 NA by



我想使用data.table,但如果by对应于缺失(NA),我想跳过j部分的计算:

下面是一个示例数据表。

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行,但想跳过结果中的计算部分,即获取输出,其中Ng为空时NA

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

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

你可以试试这个:

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

它是亨里克if ... else ...子句的代数版本。 它利用了这样一个事实,即NA^0返回1,而NA^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的值。

最新更新