如何在不定义每一列的情况下从整个data.frame中对特定值进行子集化?

时间:2017-08-28 18:06:59

标签: r dataframe subset

我的data.frame(df)由20个不同的列组成。
我的所有列都是整数值(范围0 - 99)

假设我想将我的col1和col2数据的子集(x)设置为低于4的字数。
所以我的代码可以是:

character

没关系。

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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的行数。这用于按行对data.frame进行子集化。