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

如何在不定义每一列的情况下从整个data.frame中子集特定值?,r,dataframe,subset,R,Dataframe,Subset,我的data.frame(df)由20个不同的列组成 我的所有列都是整数值(范围0-99) 假设我想对col1和col2的数据子集,它们的值(x)小于4所以我的代码可能是: df2 <- subset(df, col1 < 4 & col2 < 4) df2df2df2这里有一种比apply更快的方法,使用max.col、矩阵子集和逻辑子集。 首先,构造一个样本数据集 set.seed(1234) dat <- data.frame(a=sample(1:3,

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

假设我想对col1和col2的数据子集,它们的值(x)小于4
所以我的代码可能是:

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

df2
df2
df2这里有一种比
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))
请注意,只有第三列的值大于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)
返回每行具有最大值的列<代码>顺序(dat[[1]])
贯穿行号
cbind
返回一个矩阵,我们使用该矩阵使用矩阵子集提取每行的最大值。然后,将这些值与
>4
进行比较,看看是否有大于4的值,这将返回一个逻辑向量,其长度是data.frame的行数。这用于逐行对data.frame进行子集划分。

这里有一种比使用
max.col
、矩阵子集划分和逻辑子集划分的
apply
更快的方法。 首先,构造一个样本数据集

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))
请注意,只有第三列的值大于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)
返回每行具有最大值的列<代码>顺序(dat[[1]])
贯穿行号
cbind
返回一个矩阵,我们使用该矩阵使用矩阵子集提取每行的最大值。然后,将这些值与
>4
进行比较,看看是否有大于4的值,这将返回一个逻辑向量,其长度是data.frame的行数。这用于按行对data.frame进行子集设置。

如果您提供了一个示例输入数据,可以用来测试和验证可能的解决方案,那么将更容易为您提供帮助。@MrFlick correct->我正在寻找一种从我的example@G5W当数据有
NA
时会产生问题~@MrFlick You你说得对。我看错了问题。如果您提供了一个示例输入数据,可以用来测试和验证可能的解决方案,那么会更容易帮助您。@MrFlick correct->我正在寻找一种从我的example@G5W当数据有
NA
时,会产生问题~@MrFlick你是对的。我看错了这个问题。很好的选择!非常感谢您的回答和帮助!:)@dvantwisk我对你的答案投了更高的票,因为它看起来更干净,但是
apply
的速度是出了名的慢,尤其是对于data.frames。它本质上是
for
循环的奇特包装器,在运行该循环之前必须将data.frame转换为矩阵
max.col
,虽然仍然需要矩阵转换,但在引擎盖下进行了优化,矩阵索引(子集)通常非常快。这是一个很好的选择!非常感谢您的回答和帮助!:)@dvantwisk我对你的答案投了更高的票,因为它看起来更干净,但是
apply
的速度是出了名的慢,尤其是对于data.frames。它本质上是
for
循环的奇特包装器,在运行该循环之前必须将data.frame转换为矩阵
max.col
,虽然仍然需要矩阵转换,但在引擎盖下进行了优化,矩阵索引(子集)通常非常快。