【问题标题】:Remove rows from data.table in R based on values of several columns根据几列的值从 R 中的 data.table 中删除行
【发布时间】:2015-01-17 17:42:47
【问题描述】:

我在 R 中有一个 data.table,它有几个 id 和一个值。对于每个 id 组合,有几行。如果这些行之一在“值”列中包含 NA,我想删除所有具有这种 id 组合的行。例如,在下表中,我想删除 id1 == 2id2 == 1 的所有行。

如果我只有一个 id,我会选择dat[!(id1 %in% dat[is.na(value),id1])]。在示例中,这将删除 i1 == 2 的所有行。但是,我没有设法包含几列。

dat <- data.table(id1 = c(1,1,2,2,2,2),
                  id2 = c(1,2,1,2,3,1),
                  value = c(5,3,NA,6,7,3))

【问题讨论】:

  • 试试dat[!(id1==2 &amp; id2==1)]setkey(dat, id1, id2)[!J(2,1) ]
  • 我知道这可以在上面的简单示例中使用。但是,这个问题更笼统,因为可能有大量的行带有 NA。
  • 我想他在找dat[, if(all(!is.na(value))) .SD, .(id1, id2)]
  • @DavidArenburg:这就是我想要的,谢谢!
  • @akrun 不管怎样,谢谢你的回答,下次我会尽量说清楚。

标签: r data.table


【解决方案1】:

如果您想检查 id1id2 的每个组合是否有任何值是 NAs,然后删除整个组合,您可以在每个组中插入 if 语句并仅检索结果(使用.SD)如果该语句返回TRUE

dat[, if(!anyNA(value)) .SD, by = .(id1, id2)]
#    id1 id2 value
# 1:   1   1     5
# 2:   1   2     3
# 3:   2   2     6
# 4:   2   3     7

或者类似的,

dat[, if(all(!is.na(value))) .SD, by = .(id1, id2)]

【讨论】:

  • dat 拆分为所有.SD 并将它们堆叠起来可能会很昂贵。另一种(可能通常更快?)方法是选择要保留的行dat[dat[,!any(is.na(value)),by="id1,id2"]$V1]
  • 啊,你是对的。我确实测试了它,但不知何故让自己相信我看到的是正确的答案。我应该提到的替代方案是:dat[dat[,.I[!any(is.na(value))],by="id1,id2"]$V1]
  • @Frank 这也是一个不错的选择。
猜你喜欢
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2012-05-02
  • 2021-06-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2015-02-05
相关资源
最近更新 更多