我的data.frame(df)由20个不同的列组成。
我的所有列都是整数值(范围0 - 99)
假设我想将我的col1和col2数据的子集(x)设置为低于4的字数。
所以我的代码可以是:
character
没关系。
但是如何修改我的代码以获取我所有20列的新子集。没有指定每个特定的列。 ?
感谢您的帮助!
答案 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进行子集化。