【问题标题】:Skip NA in data.table by跳过data.table中的NA
【发布时间】:2017-11-22 21:17:55
【问题描述】:

我想使用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 行保留在输出中,但希望跳过结果中的计算部分,即获取输出,其中gNAN 为空

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

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

【问题讨论】:

  • 分组变量的 可以j 中访问 - 如果在 j 中使用,它的长度为 1(参见 @987654321 @. 所以像DT[ , if(!is.na(g)) .(n = .N) else NA_integer_, by = g] 这样的东西会起作用。
  • !is.na(g)i 参数中过滤有什么问题?即DT[!is.na(g),.N, by=g]
  • @ScottRitchie 我认为这会从结果中删除 NA 行。我仍然想要它以供后续加入。
  • @scmi 可能有重复,但您的链接问题是不是。 OP 明确指出 我想在输出中保留 NA 行,而在您的链接问题中,应该完全跳过 NA 组。

标签: r data.table


【解决方案1】:

你可以试试这个:

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

它是Henrik'sif ... 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的值。

猜你喜欢
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多