【问题标题】:Group-by operation for another column R [duplicate]另一列R的分组操作[重复]
【发布时间】:2021-11-07 08:53:00
【问题描述】:

我希望根据对另一列的分组来对一列执行操作。

假设我有以下数据:

user <- c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3)
score <- c(1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1)
time_1 <- c(130, NA, 120, 245, NA, NA, NA, 841, NA, NA, 721, 612)
time_2 <- c(NA, 742, NA, NA, 812, 212, 214, NA, 919, 528, NA, NA)
df <- data.frame(user, score, time_1, time_2) 

我们得到以下df:

   user score time_1 time_2
    1     1    130     NA
    1     0     NA    742
    1     1    120     NA
    1     1    245     NA
    2     0     NA    812
    2     0     NA    212
    2     0     NA    214
    2     1    841     NA
    3     0     NA    919
    3     0     NA    528
    3     1    721     NA
    3     1    612     NA

对于每个用户 1,time_1 的最小值是多少? 因此,我希望按用户编号对用户进行分组,并对列 time_1 执行操作。

【问题讨论】:

    标签: r group-by multiple-columns


    【解决方案1】:

    关于 OP 请求的更新(见 cmets): 只需将summarise 替换为mutate

    df %>% 
      group_by(user) %>% 
      mutate(Smallest_time1 = min(time_1, na.rm=TRUE))
    
        user score time_1 time_2 Smallest_time1
       <dbl> <dbl>  <dbl>  <dbl>          <dbl>
     1     1     1    130     NA            120
     2     1     0     NA    742            120
     3     1     1    120     NA            120
     4     1     1    245     NA            120
     5     2     0     NA    812            841
     6     2     0     NA    212            841
     7     2     0     NA    214            841
     8     2     1    841     NA            841
     9     3     0     NA    919            612
    10     3     0     NA    528            612
    11     3     1    721     NA            612
    12     3     1    612     NA            612
    

    我们可以在summarise 中使用min()na.rm=TRUE 参数:

    library(dplyr)
    df %>% 
      group_by(user) %>% 
      summarise(Smallest_time1 = min(time_1, na.rm= TRUE))
    
     user Smallest_time1
      <dbl>          <dbl>
    1     1            120
    2     2            841
    3     3            612
    

    【讨论】:

    • 效果很好。是否可以将Smallest_time1 的值分配给新列中原始df 中的用户?
    • 请看我的更新!
    • 类似地,是否可以仅在说score = 1 时计算此操作?编辑:我使用了 filter() 并且效果很好。感谢您的帮助!
    • 你可以使用ifelse 喜欢:df %&gt;% group_by(user) %&gt;% mutate(Smallest_time1 = ifelse(score==1, min(time_1, na.rm=TRUE), time_1))
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2020-05-30
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多