【问题标题】:Select rows with identical columns from a data frame从数据框中选择具有相同列的行
【发布时间】:2013-01-18 20:51:55
【问题描述】:

我有一个包含几列的数据框。 我想选择没有NAs 的行(与complete.cases 一样) 和所有列相同。 例如,对于

> f <- data.frame(a=c(1,NA,NA,4),b=c(1,NA,3,40),c=c(1,NA,5,40))
> f
   a  b  c
1  1  1  1
2 NA NA NA
3 NA  3  5
4  4 40 40

我希望向量 TRUE,FALSE,FALSE,FALSE 只选择第一行,因为所有 3 列都是相同的,没有一个是 NA。

我可以的

Reduce("==",f[complete.cases(f),])

但这会创建一个我希望避免的中间数据帧(以节省内存)。

【问题讨论】:

  • 你的数据都是数字吗?
  • 你知道在 SO 和 Rhelp 上交叉发布被认为是糟糕的形式吗?
  • @DWin:为什么?它是否记录在某处?
  • 阅读 Rhelp 发布指南。您在 Rhelp 上发帖的时间已经够长了,现在应该这样做了。
  • @DWin:我没有看到任何关于交叉发布的内容。

标签: r dataframe


【解决方案1】:

试试这个:

R > index <- apply(f, 1, function(x) all(x==x[1]))
R > index
[1]  TRUE    NA NA FALSE
R > index[is.na(index)] <- FALSE
R > index
[1]  TRUE FALSE FALSE FALSE

【讨论】:

  • 这似乎适用于玩具示例,谢谢,但它需要永远在具有 766,950 行和 2 列的真实数据集上
  • 如果只有两列,试试f[,1]==f[,2] ?然后将NA 替换为FALSE ?
  • data.table 中可能有一种快速的方法可以做到这一点,但我想不通。如此标记以吸引data.table 专家。
  • @Michael,Bill Dunlap 在交叉发布的 R 帮助线程中展示了一种在 base R 中执行此操作的快速方法:stat.ethz.ch/pipermail/r-help/2013-January/345587.html
【解决方案2】:

最佳(IMO)解决方案来自David Winsemius:

which( rowSums(f==f[[1]]) == length(f) )

【讨论】:

  • 解决方案很好。 -1 用于不将其标记为社区 wiki,因为您只是发布 @DWin 的答案。
  • @GSee:我不知道“将其标记为社区 wiki”是什么意思。你这样做怎么样,我删除我的答案?
  • 编辑您的答案(点击编辑链接),然后在您输入答案的右侧下方有一个复选框,上面写着“社区维基”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
相关资源
最近更新 更多