我想使用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
行,但想跳过结果中的计算部分,即获取输出,其中N
在g
为空时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
,并且FALSE
和TRUE
可以被胁迫到0
和1
,或者。
如果要控制列名:
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
的值。