我想根据日益缩小的条件制作一系列情节。这是一个示例数据框:
df <- data.frame(A=rep(letters[1:4],4),B=sample(1:5, 16, replace=TRUE),C=sample(1:500, 16, replace=TRUE))
以下是示例条件:
cond_1 <- df$A!='a'
cond_2 <- df$A!='b'
cond_3 <- df$C < 400 & df$C > 100
你能帮我找到一个方便的方法来添加条件,比如说:
plot(df$B)
plot(df$B[cond_1])
plot(df$B[cond_1 & cond_2])
plot(df$B[cond_1 & cond_2 & cond_3])
我试过制作一个循环,但是我很难让条件加起来很好。
cond_list <- list(cond_1,cond_2,cond_3)
list_1 <- list()
list_2 <- list()
for(i in 1:3){
list_1<- cond_list[i]
list_2[i] <- list_1
mat_1 <- do.call(cbind,list_2)
plot(df$B[c(mat_1[,i],mat_1[,i-1])])
}
答案 0 :(得分:2)
我会使用dplyr
:
library(dplyr)
# Make a list of the required conditions
condition_list = c('A != "a"',
'A != "b"',
'C < 400 & C > 100')
# Filter using the first condition
> df %>% filter_(.dots = condition_list[1])
A B C
1 b 1 399
2 c 4 208
3 d 4 331
4 b 5 21
5 c 3 211
6 d 1 408
7 b 4 438
8 c 2 165
9 d 2 120
10 b 5 43
11 c 3 23
12 d 1 181
# Filter using the first and second condition
> df %>% filter_(.dots = condition_list[1:2])
A B C
1 c 4 208
2 d 4 331
3 c 3 211
4 d 1 408
5 c 2 165
6 d 2 120
7 c 3 23
8 d 1 181
# Filter using all three conditions
> df %>% filter_(.dots = condition_list[1:3])
A B C
1 c 4 208
2 d 4 331
3 c 3 211
4 c 2 165
5 d 2 120
6 d 1 181
您可以随意混搭。应用filter_
后,您可以将该数据输入plot
。
注意我使用filter_
版本的filter
,它允许您将过滤器表达式作为字符串传递(另请参阅this article)。另外,%>%
是一个管道,与bash(linux)中管道的使用非常相似,请参阅tutorial I wrote进行更深入的讨论。