使用循环向逻辑向量添加条件[r]

时间:2016-12-06 11:59:21

标签: r

我想根据日益缩小的条件制作一系列情节。这是一个示例数据框:

    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])])
    }

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进行更深入的讨论。