所有/任何列都大于特定值的子集行

Roc*_*ock 15 r

df <- data.frame(id=c(1:5), v1=c(0,15,9,12,7), v2=c(9,32,6,17,11))
Run Code Online (Sandbox Code Playgroud)

如何在大于10的所有列上提取具有值的行,该列应返回:

  id v1 v2
2  2 15 32
4  4 12 17
Run Code Online (Sandbox Code Playgroud)

如果在任何大于10的列上,该怎么办?

  id v1 v2
2  2 15 32
4  4 12 17
5  5  7 11
Run Code Online (Sandbox Code Playgroud)

Rei*_*son 20

分别参见函数all()any()问题的第一部分和第二部分.该apply()函数可用于在行或列上运行函数.(MARGIN = 1是行,MARGIN = 2是列等).注意我在进行比较时使用apply()on df[, -1]来忽略id变量.

第1部分:

> df <- data.frame(id=c(1:5), v1=c(0,15,9,12,7), v2=c(9,32,6,17,11))
> df[apply(df[, -1], MARGIN = 1, function(x) all(x > 10)), ]
  id v1 v2
2  2 15 32
4  4 12 17
Run Code Online (Sandbox Code Playgroud)

第2部分:

> df[apply(df[, -1], MARGIN = 1, function(x) any(x > 10)), ]
  id v1 v2
2  2 15 32
4  4 12 17
5  5  7 11
Run Code Online (Sandbox Code Playgroud)

看到发生了什么事,x > 10返回一个逻辑向量的每一行(通过apply()指示每个元素是否大于10 all()返回TRUE,如果所有的输入向量的元素是TRUEFALSE其它.any()返回TRUE如果任何在输入的元素是TRUEFALSE如果所有是的FALSE.

然后我使用apply()调用产生的逻辑向量

> apply(df[, -1], MARGIN = 1, function(x) all(x > 10))
[1] FALSE  TRUE FALSE  TRUE FALSE
> apply(df[, -1], MARGIN = 1, function(x) any(x > 10))
[1] FALSE  TRUE FALSE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

子集df(如上所示).


bna*_*aul 6

这可以使用apply边距1 来完成,边距1将向每行应用函数.检查给定行的函数是

function(row) {all(row > 10)}
Run Code Online (Sandbox Code Playgroud)

所以提取行本身的方法是

df[apply(df, 1, function(row) {all(row > 10)}),]
Run Code Online (Sandbox Code Playgroud)

  • 等等,你想要`all(row [-1]> 10)`不要考虑`id`列.或者在`df [-1]`上应用该函数. (2认同)