【问题标题】:How can I add rows which has consecutive year values based on the range in R?如何根据 R 中的范围添加具有连续年份值的行?
【发布时间】:2022-10-05 08:50:39
【问题描述】:

我想将 df 转换为 df1

如何根据从开始年份到结束年份的范围添加具有连续年份值的行?

简而言之,我怎样才能改变变量“出口关系”?

df <- data.frame(home = c("a", "b", "c"), host = c("d", "e", "f"), export_start = c(2015, 2016, 2016), export_end = c(2015, 2018, 2020), average_ratio = c(0.2, 0.3, 0.5), gap = c(0, 2, 4))
> df
  home host export_start export_end average_ratio gap
1    a    d         2015       2015           0.2   0
2    b    e         2016       2018           0.3   2
3    c    f         2016       2020           0.5   4
> df1
  home host export_relation average_ratio
1    a    d            2015           0.2
2    b    e            2016           0.3
3    b    e            2017           0.3
4    b    e            2018           0.3
5    c    f            2016           0.5
6    c    f            2017           0.5
7    c    f            2018           0.5
8    c    f            2019           0.5
9    c    f            2020           0.5

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一个 tidyverse 解决方案:

    library(tidyverse)
    
    df %>% 
      rowwise() %>% 
      group_map(
        function(.x, .y) {
          .x %>% 
            expand(nesting(home, host), export_relation=export_start:export_end)
        }
      ) %>% 
      bind_rows()
    # A tibble: 9 × 3
      home  host  export_relation
      <chr> <chr>           <int>
    1 a     d                2015
    2 b     e                2016
    3 b     e                2017
    4 b     e                2018
    5 c     f                2016
    6 c     f                2017
    7 c     f                2018
    8 c     f                2019
    9 c     f                2020
    

    group_map 将由其参数定义的函数依次应用于分组 tibble 的每一组。该函数的参数应该是.x:当前组中的数据和.y:包含定义当前组的列(及其值)的单行小标题。在这种情况下不需要.y

    group_map 返回一个列表:这里是小标题列表。 bind_rows 将列表组合成一个小标题。

    【讨论】:

    • 在这种情况下,无需调用nesting
    • 太感谢了!
    猜你喜欢
    • 2016-01-10
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多