【问题标题】:dplyr: test if every column is equal some value and output column(s) unequaldplyr:测试每列是否等于某个值并且输出列不相等
【发布时间】:2015-10-04 13:12:06
【问题描述】:

我有一个包含 ID 列和数字列的数据框。我想测试每个数字列是否等于某个值,如果不是,则输出不等于该值的列。

> df
Source: local data frame [6 x 10]

     id    c1    c2    c3    c4    c5    c6    c7    c8    c9
  (int) (int) (int) (int) (int) (int) (int) (int) (int) (int)
1     1     1     1     1     1     1     1     1     1     4
2     2     1     1     1     1     1     1     1     1     1
3     3     1     1     1     1     1     1     1     1     1
4     4     1     2     1     1     1     1     1     1     1
5     5     1     1     1     1     1     1     1     1     1
6     6     1     1     1     1     2     1     1     1     1

有没有办法在 dplyr 中做到这一点?我可以通过过滤器测试每一列来做到这一点,但要寻找一种简单的方法。

library(dplyr)    
filter(df, c1 == 1, c2 == 1, c3 == 1, c4 == 1, c5 == 1, c6 == 1, c7 == 1, c8 == 1, c9 ==1)

我正在寻找一种不需要我枚举每个列名的解决方案。

当我翻转条件以查找至少有一个不相等的行(如下所示)时,我仍然需要测试每一列以查看哪一列“不等于”指定值。太麻烦了。

filter(df, c1 > 1 | c2 > 1 | c2 > 1
       | c4 > 1 | c5 > 1 | c6 > 1 | c7 > 1 | c8 > 1 | c9 > 1)

【问题讨论】:

  • 为什么必须是“dplyr”?为什么不只是which
  • 我有点困惑。您似乎想检查每个带有数字的列是否具有相同的值(即 1)。如果是这种情况,我会做df[, sapply(df, function(x){any(x != 1)})]。但是,当我运行您的filter 代码时,您选择了所有包含1 的行。我想知道你的意思是行而不是列。
  • 是的,这也是一个用例。它可以翻转为它们都不为零。我正在寻找一种不需要我枚举每个列名的解决方案。
  • 这是一个非常有趣的解决方案。没想过使用 sapply 处理子集的情况。尽管在我的情况下, ID 列永远不会等于单个值。所以,这行不通。
  • 你能澄清你说Although, in my case, ID column will never be equal to a single value的意思吗?再来一份恩情。你能向所有用户展示你想要的输出吗?这将对我们所有人都有帮助。

标签: r dplyr


【解决方案1】:

假设您想要的输出是第二个过滤器代码生成的输出,我会在下面这样做。

df[rowSums(df[-1]) != ncol(df[-1]), ]

#  id c1 c2 c3 c4 c5 c6 c7 c8 c9
#1  1  1  1  1  1  1  1  1  1  4
#4  4  1  2  1  1  1  1  1  1  1
#6  6  1  1  1  1  2  1  1  1  1

rowSums(df[-1]) != ncol(df[-1]) 生成一个逻辑向量。对于每一行,您将数字相加。由于您的目标值为1,因此如果所有列都有1,则总数应等于列数。使用此检查,您可以按df[rowSums(df[-1]) != ncol(df[-1]), ] 对行进行子集化。我希望这就是你所追求的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2017-07-21
    • 2010-10-06
    • 1970-01-01
    相关资源
    最近更新 更多