【问题标题】:Drop columns in a data.frame that do not contain a specific value?删除 data.frame 中不包含特定值的列?
【发布时间】:2020-03-25 06:57:45
【问题描述】:

我有一个包含 5 列的 data.frame,其中 4 列包含从 0 到 99 的值,只有 1 列包含从 0 到 100 的值。基本上我想创建一个逻辑函数来删除任何 4 列不包含值 100。

因此假设应该删除 column1、column2、column3 和 column5,因为 column4 是唯一包含值 100 的列。

此外,手动删除列不是一种选择,因为列的值每天都会通过自动化框架更新。所以逻辑函数是完美的。

【问题讨论】:

标签: r rstudio


【解决方案1】:

我们可以使用colSums

df[, colSums(df == 100, na.rm = TRUE) > 0]

#    b   d
#1  10 100
#2  12  98
#3 100 100
#4   1   1

或者dplyr

library(dplyr)
df %>% select_if(~any(. == 100, na.rm = TRUE))

数据

df <- data.frame(a = c(89, 23, 25, 21),b = c(10, 12, 100, 1), 
                 c = c(10, 1, 3, 6), d = c(100, 98, 100, 1))

【讨论】:

  • colSums 工作得很好,谢谢! dplyr 方法由于某种原因删除了错误的列
  • @srb633 也许这也需要na.rm 参数。我已经更新了答案。
  • 是的,我很感激,由于我的经验不足,我只是一个简短的问题。执行原始 colSums 行时,它还会删除该列的名称,只留下值?数据类型更改为“字符”,不知道是否与它有关。我需要保留名称来标识未删除的列,为什么会这样?
  • 如果您只有 1 列,则可能会发生这种情况。添加drop = FALSEdf[, colSums(df == 100, na.rm = TRUE) &gt; 0, drop =FALSE]
  • 甜蜜做到了。再次感谢
猜你喜欢
  • 1970-01-01
  • 2023-02-17
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多