【问题标题】:New data frame, if specific value(s) is contained AND other values aren't included in a range of columns in r新数据框,如果包含特定值且其他值不包含在 r 的列范围内
【发布时间】:2021-04-03 23:18:33
【问题描述】:

所以,我有一个大型数据框,每月观察 n 个人。

工业 y_0101 y_0102 y_0103 y_0104_ .... y_0311 y_0312 33 6 1 2 1 5 B 36 5 0 2 1 5 C 22 4 1 不适用 1 5 D 2 2 0 2 1 5 E 5 2 1 2 1 6 F 7 1 0 2 1 5 G 8 6 1 2 1 5 H 2 8 0 2 2 5 我 1 3 1 2 1 5 Ĵ 3 2 0 2 1 5

我想创建一个新的数据框,其中包括满足某些特定条件的个人。 例如。如果对于个人 i,y_0101:y_0312 列的范围不包括值 3 & 6 & NA,并且包括值 2 | 1 那么对于个人 i 应该包含在新的数据框中。生成以下数据框:

工业 y_0101 y_0102 y_0103 y_0104_ .... y_0311 y_0312 B 36 5 0 2 1 5 D 2 2 0 2 1 5 F 7 1 0 2 1 5 H 2 8 0 2 2 5

我尝试了不同的方法,但我不知道如何包含多个条件。

df <- df %>% filter(vars(starts_with("y_"))!=3 | !=6 | != NA)

df <- df %>% filter_at(vars(starts_with("y_")), all_vars(!=3 | !=6 | != NA)

我也尝试了其他一些方法,例如!%in%,但这似乎不起作用。有什么想法吗?

【问题讨论】:

    标签: r dataframe for-loop


    【解决方案1】:

    我想你快到了,但可能需要稍微改变一下逻辑:

    df <- data.frame(A1 = 1:10,
                     A2 = 10:1,
                     A3 = 1:10,
                     B1 = 1:10)
    df %>% 
      filter_at(vars(starts_with("A")), ~!(.x %in% c(3, 6, NA))) %>% 
      filter(if_any(starts_with("A"), ~ .x %in% c(1, 2)))
    

    在第一步中,我过滤掉任何列为 3、6 或 NA 的所有行。在第二行中,我只过滤到至少其中一列为 1 或 2 的行。这对您的情况有帮助吗?

    【讨论】:

      【解决方案2】:

      这是使用 rowSums 的基本 R 选项:

      cols <- grep('y_', names(df))
      include <- c(1, 2)
      not_include <- c(3, 6, NA)
      
      result <- subset(df, rowSums(sapply(df[cols], `%in%`, include)) > 0 & 
                           rowSums(sapply(df[cols], `%in%`, not_include)) == 0)
      result
      
      #  ind y_0101 y_0102 y_0103 y_0104 y_0311 y_0312
      #2   B     36      5      0      2      1      5
      #4   D      2      2      0      2      1      5
      #6   F      7      1      0      2      1      5
      #8   H      2      8      0      2      2      5
      

      数据

      df <- structure(list(ind = c("A", "B", "C", "D", "E", "F", "G", "H", 
      "I", "J"), y_0101 = c(33L, 36L, 22L, 2L, 5L, 7L, 8L, 2L, 1L, 
      3L), y_0102 = c(6L, 5L, 4L, 2L, 2L, 1L, 6L, 8L, 3L, 2L), y_0103 = c(1L, 
      0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L), y_0104 = c(2L, 2L, NA, 2L, 
      2L, 2L, 2L, 2L, 2L, 2L), y_0311 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
      2L, 1L, 1L), y_0312 = c(5L, 5L, 5L, 5L, 6L, 5L, 5L, 5L, 5L, 5L
      )), class = "data.frame", row.names = c(NA, -10L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多