同
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,如果所有的输入向量的元素是TRUE和FALSE其它.any()返回TRUE如果任何在输入的元素是TRUE与FALSE如果所有是的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(如上所示).
这可以使用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)