2017-08-28 64 views
0

我的data.frame(df)由20个不同的列组成。
所有我的专栏是整数值(范围0 - 99)
如何在不定义每列的情况下对整个data.frame中的特定值进行子集划分?

比方说,我想子集我有较低的值(x)大于4
所以我的代码可能是COL1和COL2的数据:

df2 <- subset(df, col1 < 4 & col2 < 4) 

这很好。

但是,如何修改我的代码以获得我所有20列的新子集。没有指定每一个特定的列。 ?

感谢您的帮助!

+1

如果你提供了一个[可重现的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)和样本输入,它会更容易帮助你数据可用于测试和验证可能的解决方案。 – MrFlick

+0

@MrFlick正确 - >我正在寻找一种有效的方法来编写这样的案例,如我的示例 – ira01

+0

@ G5W,当数据有“NA”会产生问题〜 – Wen

回答

1

这里是比apply更快的方法,使用max.col,基质子集,和逻辑子集。首先,构建一个样本数据集。

set.seed(1234) 
dat <- data.frame(a=sample(1:3, 5, replace=TRUE), 
        b=sample(1:4, 5, replace=TRUE), 
        c=sample(1:6, 5, replace=TRUE)) 

看起来像这样。

dat 
    a b c 
1 1 3 5 
2 2 1 4 
3 2 1 2 
4 2 3 6 
5 3 3 2 

请注意,只有第三列的值大于4,列中只有2个这样的元素通过测试。现在,我们做

dat[dat[cbind(seq_along(dat[[1]]), max.col(dat))] > 4, ] 
    a b c 
1 1 3 5 
4 2 3 6 

这里,max.col(dat)返回每行最大值的列。 seq_along(dat[[1]])贯穿行号。 cbind返回一个矩阵,我们使用该矩阵为矩阵子集提取每行的最大值。然后,比较这些值,看看是否有大于4的数字,用> 4返回一个逻辑向量,其长度是data.frame的行数。这用于逐行对数据进行子集分类。

+0

伟大的选择!非常感谢您的回答和帮助! :) – ira01

+0

你是对的,这是更快。 – dvantwisk

+0

@dvantwisk我提高了你的答案,因为它看起来更清晰,但'apply'速度慢,特别是对于data.frames。它本质上是一个'for'循环的花式包装,它必须在运行该循环之前将data.frame转换为矩阵。 'max.col'在仍然需要矩阵转换的情况下进行了优化,矩阵索引(子集)通常非常快。 – lmo

2
df2 <- df[apply(df, 1, max) < 4,] 
+0

这么简单 - 谢谢! – ira01

相关问题