【问题标题】:New column with row difference based on condition基于条件的具有行差异的新列
【发布时间】:2021-06-14 08:13:50
【问题描述】:

我想根据条件在data.frame中创建一个新的列差异,例如我有这个data.frame:

    structure(list(ID = c(1, 1, 2, 2), Condition = c("a", "b", "a", 
"b"), Value = c(20, 30, 50, 45)), class = "data.frame", row.names = c(NA, 
-4L))

  ID Condition Value
1  1         a    20
2  1         b    30
3  2         a    50
4  2         b    45

然后,对于每个 ID,我想在 Condition = a 时获得一个新列,在 Condition = b 时获得 Value 差异 b-a。换句话说,我想获得这个,但我很挣扎:

  ID Condition Value Diff
1  1         a    20   20
2  1         b    30   10
3  2         a    50   50
4  2         b    45   -5

您将如何继续执行此操作?谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    这行得通吗:

    library(dplyr)
    df %>% 
      arrange(ID, Condition) %>% 
       mutate(Diff = case_when(Condition == 'a' ~ Value, 
                                TRUE ~ Value - lag(Value)))
    
       ID Condition Value Diff
    1  1         a    20   20
    2  1         b    30   10
    3  2         a    50   50
    4  2         b    45   -5
    

    【讨论】:

      【解决方案2】:

      你可以做-

      library(dplyr)
      
      df %>%
        group_by(ID) %>%
        mutate(Diff = replace(Value, Condition == 'b', Value[Condition == 'b'] - Value[Condition == 'a'])) %>%
        #Can also use ifelse if it is easier to understand
        #mutate(Diff = ifelse(Condition == 'b', Value[Condition == 'b'] - Value[Condition == 'a'], Value)) %>%
        ungroup
      
      #     ID Condition Value  Diff
      #  <dbl> <chr>     <dbl> <dbl>
      #1     1 a            20    20
      #2     1 b            30    10
      #3     2 a            50    50
      #4     2 b            45    -5
      

      如果在你的真实数据中你只有两个条件并且想用第一个值减去第二个值,这也可以减少到 -

      df %>%
        arrange(ID, Condition) %>%
        group_by(ID) %>%
        mutate(Diff = replace(Value, n(), diff(Value)))
      

      【讨论】:

        猜你喜欢
        • 2021-11-07
        • 1970-01-01
        • 2011-11-15
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        • 2022-11-27
        • 1970-01-01
        • 2021-08-19
        相关资源
        最近更新 更多