根据多个条件过滤一组data.frame

时间:2020-10-13 11:53:11

标签: r dplyr tidyverse

我正在寻找一种优雅的方法来根据多种条件过滤一组特定的大数据框的值。

我的数据框看起来像这样。

data=data.frame(group=c("A","B","C","A","B","C","A","B","C"), 
                time= c(rep(1,3),rep(2,3), rep(3,3)), 
                value=c(0.2,1,1,0.1,10,20,10,20,30))

  group time value
1     A    1   0.2
2     B    1   1.0
3     C    1   1.0
4     A    2   0.1
5     B    2  10.0
6     C    2  20.0
7     A    3  10.0
8     B    3  20.0
9     C    3  30.0

我只希望在时间点1过滤掉所有小于1但大于0.1的值

我希望我的data.frame看起来像这样。

  group time value
1     A    1   0.2
4     A    2   0.1
5     B    2  10.0
6     C    2  20.0
7     A    3  10.0
8     B    3  20.0
9     C    3  30.0

我们非常感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

使用dplyr,您可以完成

library(dplyr)

data %>% filter(!(time == 1 & (value <= 0.1 | value >= 1))) 

#   group time value
# 1     A    1   0.2
# 2     A    2   0.1
# 3     B    2  10.0
# 4     C    2  20.0
# 5     A    3  10.0
# 6     B    3  20.0
# 7     C    3  30.0

答案 1 :(得分:1)

或者,如果您有太多的空闲时间而决定避免使用dplyr

ind <- with(data, (data$time==1 & (data$value > 0.1 & data$value < 1)))
ind <- ifelse((data$time==1) & (data$value > 0.1 & data$value < 1), TRUE, FALSE)
#above two do the same

data$ind <- ind
data <- data[!(data$time==1 & ind==F),]
data$ind <- NULL

  group time value
1     A    1   0.2
4     A    2   0.1
5     B    2  10.0
6     C    2  20.0
7     A    3  10.0
8     B    3  20.0
9     C    3  30.0

答案 2 :(得分:0)

另一个简单的选择是使用subset两次,然后以行方式附加结果。

rbind(
  subset(data, time == 1 & value > 0.1 & value < 1),
  subset(data, time != 1)
)

#    group time value
# 1     A    1   0.2
# 4     A    2   0.1
# 5     B    2  10.0
# 6     C    2  20.0
# 7     A    3  10.0
# 8     B    3  20.0
# 9     C    3  30.0