【问题标题】:Conditional statement within group组内条件语句
【发布时间】:2019-05-04 13:59:05
【问题描述】:

我有一个数据框,我想在其中创建一个新列,其中包含基于组内条件的值。因此,对于下面的数据框,我想创建一个新列 n_actions,它给出了

条件 1。对于整个组 GROUP 数字 2 如果 6 出现在 STEP 列中 条件 2. 对于整个组 GROUP,如果 9 出现在 STEP 列中,则数字 3 条件 3. 如果 GROUP 的 STEP 列中没有出现 6 或 9,则为 1

#dataframe start
dataframe <- data.frame(group = c("A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D"),
               step = c(1, 2, 3, 1, 2, 3, 4, 5, 6, 1, 2, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9))

# dataframe desired
dataframe$n_actions <- c(rep(1, 3), rep(2, 6,), rep(1, 3), rep(3, 9))

【问题讨论】:

    标签: r dataframe group-by conditional


    【解决方案1】:

    试用:

    library(dplyr)
    dataframe %>% 
            group_by(group) %>%
            mutate(n_actions = ifelse(9 %in% step, 3, 
                                      ifelse(6 %in% step, 2, 1)))
    # A tibble: 21 x 3
    # Groups:   group [4]
        group  step n_actions
       <fctr> <dbl>     <dbl>
     1      A     1         1
     2      A     2         1
     3      A     3         1
     4      B     1         2
     5      B     2         2
     6      B     3         2
     7      B     4         2
     8      B     5         2
     9      B     6         2
    10      C     1         1
    # ... with 11 more rows
    

    【讨论】:

    • 这没有提供所需的输出。 9 %in% step 需要先来
    【解决方案2】:

    dplyr's case_when 的另一种方式:

    library(dplyr)
    
    dataframe %>% 
      group_by(group) %>%
      mutate(
        n_actions1 = case_when(
          9 %in% step ~ 3,
          6 %in% step ~ 2,
          TRUE ~ 1
        )
      )
    

    输出:

    # A tibble: 21 x 3
    # Groups:   group [4]
       group  step n_actions
       <fct> <dbl>     <dbl>
     1 A         1         1
     2 A         2         1
     3 A         3         1
     4 B         1         2
     5 B         2         2
     6 B         3         2
     7 B         4         2
     8 B         5         2
     9 B         6         2
    10 C         1         1
    11 C         2         1
    12 C         3         1
    13 D         1         3
    14 D         2         3
    15 D         3         3
    16 D         4         3
    17 D         5         3
    18 D         6         3
    19 D         7         3
    20 D         8         3
    21 D         9         3
    

    【讨论】:

    • 这给出了Error: 'match' requires vector arguments 错误。有什么想法吗?
    • 这对我来说就像一个魅力。此外,这种方法非常灵活。我选择这个作为我的最终解决方案
    • @VivekKalyanarangan,对不起,不知道,我第一次看到上述函数的这个错误。
    • @arg0naut 我正在使用dplyr==0.5.0R version 3.3.2 (2016-10-31) Platform: x86_64-apple-darwin13.4.0 (64-bit) Running under: macOS 10.14.1
    【解决方案3】:

    您似乎可以将每组的最大值除以%/% 3

    dataframe <- transform(dataframe,
                           n_actions2 = ave(step, group, FUN = function(x) max(x) %/% 3))
    dataframe
    #   group step n_actions n_actions2
    #1      A    1         1          1
    #2      A    2         1          1
    #3      A    3         1          1
    #4      B    1         2          2
    #5      B    2         2          2
    #6      B    3         2          2
    #7      B    4         2          2
    #8      B    5         2          2
    #9      B    6         2          2
    #10     C    1         1          1
    #11     C    2         1          1
    #12     C    3         1          1
    #13     D    1         3          3
    #14     D    2         3          3
    #15     D    3         3          3
    #16     D    4         3          3
    #17     D    5         3          3
    #18     D    6         3          3
    #19     D    7         3          3
    #20     D    8         3          3
    #21     D    9         3          3
    

    【讨论】:

    • 谢谢,这是聪明的想法:)
    猜你喜欢
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2014-08-02
    相关资源
    最近更新 更多