【问题标题】:Add column to data frame with multiple conditions and formulas based on earlier rows根据先前的行将列添加到具有多个条件和公式的数据框
【发布时间】:2021-10-13 22:14:54
【问题描述】:

所以我有数据争论的问题。

这是我的示例数据。

year <- c(2019, 2019, 2020, 2020, 2021, 2021, 2021)
sn <- c("AB1001", "AB1002", "AB1001", "DC1001", "AB1002", "AB1001", "AB1003")
hours <- c(150, 173, 189, 102, 175, 215, 98)
delta_hours <- c(150, 173, 39, 102, NA, NA, NA)
df <- data.frame(year, sn, hours, delta_hours)

产生这个数据框:

year     sn hours delta_hours
1 2019 AB1001   150         150
2 2019 AB1002   173         173
3 2020 AB1001   189          39
4 2020 DC1001   102         102
5 2021 AB1002   175          NA
6 2021 AB1001   215          NA
7 2021 AB1003    98          NA

我需要做的是改变/更新 2021 年的 delta_hours 列。具体来说,对于唯一的 sn(前几年没有),我希望能够简单地复制 hours 列中的信息.对于前几年出现的sn,我想用最近一年的小时数减去2021年的小时数。所以对于sn AB1001,我想取215 - 189 以获得26。对于 sn AB1003,我想简单地复制 98。当然,对于 2021 年之前的任何一年,我只想保留这些信息。

我的最终数据框应该基本上是这样的:

year     sn hours delta_hours
1 2019 AB1001   150         150
2 2019 AB1002   173         173
3 2020 AB1001   189          39
4 2020 DC1001   102         102
5 2021 AB1002   175           2
6 2021 AB1001   215          26
7 2021 AB1003    98          98

我假设我需要使用case_when,我可以这样做来获取前几年的数据以简单地复制,但我不知道如何正确地进行减法。

帮助表示赞赏!谢谢!

【问题讨论】:

    标签: r dataframe data-wrangling


    【解决方案1】:
    library(dplyr)
    
    df %>% 
      group_by(sn) %>% 
      mutate(
        delta_hours = if_else(year == 2021, hours - lag(hours), delta_hours),
        delta_hours = if_else(is.na(delta_hours), hours, delta_hours)
      )
    
    # A tibble: 7 x 4
    # Groups:   sn [4]
       year sn     hours delta_hours
      <dbl> <chr>  <dbl>       <dbl>
    1  2019 AB1001   150         150
    2  2019 AB1002   173         173
    3  2020 AB1001   189          39
    4  2020 DC1001   102         102
    5  2021 AB1002   175           2
    6  2021 AB1001   215          26
    7  2021 AB1003    98          98
    

    【讨论】:

    • 由于存在额外的细微差别,我不得不对我的真实数据进行轻微修改,所以我在第二步中将它与 case_when 结合在 mutate() 中,但我不知道 @ 987654324@ 函数,这就是我真正需要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    相关资源
    最近更新 更多