我有一个数据框,我想过滤它:
employee <- c('John Doe','Peter Gynn','Jolie Hope', 'Michael')
salary <- c(21000, 23400, 26800, 25000)
number <- c(1,2,3,5)
df <- data.frame(employee,salary,number)
> df
employee salary number
1 John Doe 21000 1
2 Peter Gynn 23400 2
3 Jolie Hope 26800 3
4 Michael 25000 5
我也有这些载体:
vectorMin <- c(22000,1.5)
vectorMax <- c(26000,4.5)
我希望使用22000到26000之间的工资和1.5到4.5之间的数字来过滤数据框。在这种情况下,我希望数据框只有Peter Gynn。我试过了:
(df >= vectorMin) & (df <= vectorMax)
但这不起作用。我该怎么办?
答案 0 :(得分:5)
您可以使用Map
对矢量/列表元素执行一对一操作。然后我们可以将结果与Reduce
结合起来。首先,我们定义一个函数between
(为包含问题的特定需求而编写),它返回相关范围内值的逻辑向量。您也可以在Map
中使用匿名函数。
between <- function(x, min, max) x >= min & x <= max
df[Reduce("&", Map(between, df[-1], vectorMin, vectorMax)), ]
# employee salary number
# 2 Peter Gynn 23400 2
答案 1 :(得分:3)
vectorMin <- c(22000,1.5)
vectorMax <- c(26000,4.5)
df[df$salary > vectorMin[1] & df$salary < vectorMax[1]
& df$number > vectorMin[2] & df$number < vectorMax[2],]
答案 2 :(得分:0)
使用强大的dplyr
包很容易实现:
library(dplyr)
df %>%
filter(salary >= 22000, salary <= 26000, number >= 1.5, number <= 4.5)
# 1 Peter Gynn 23400 2