【问题标题】:Create multiple new dataframes based on rows in another dataframe with a for loop in r根据另一个数据帧中的行创建多个新数据帧,并在 r 中使用 for 循环
【发布时间】:2020-02-12 05:42:15
【问题描述】:

我有一个如下所示的数据框:

df <- data.frame(ID = c(1,2,3,4,5,6), Type = c("A","A","B","B","C","C"), `2019` = c(1,2,3,4,5,6),`2020` = c(2,3,4,5,6,7), `2021` = c(3,4,5,6,7,8))

  ID Type X2019 X2020 X2021
1  1    A     1     2     3
2  2    A     2     3     4
3  3    B     3     4     5
4  4    B     4     5     6
5  5    C     5     6     7
6  6    C     6     7     8

现在,我正在寻找一些执行以下操作的代码: 1.为df中的每一行创建一个新的data.frame 2.用“ID”和“类型”(A_1,A_2,...,C_6)的组合命名新的数据帧

生成的新数据帧应如下所示(A_1、A_2 和 C_6 的示例):

  Year Values
1 2019      1
2 2020      2
3 2021      3

  Year Values
1 2019      2
2 2020      3
3 2021      4

  Year Values
1 2019      6
2 2020      7
3 2021      8

我有一些使代码复杂化的事情: 1. 代码在接下来的几年内应该可以正常工作,没有任何变化,这意味着明年 data.frame df 将不再包含 2019-2021 年,而是 2020-2022 年。 2. 由于 data.frame df 只是一个最小的可重现示例,我需要某种循环。在“真实”数据中,我有更多的行,因此要创建更多的数据框。

很遗憾,我不能给你任何代码,因为我完全不知道如何管理它。 在研究过程中,我发现以下代码可能有助于解决岁月变化的第一个问题:

year <- as.numeric(format(Sys.Date(), "%Y"))

此外,我阅读了有关列表的信息,它可能有助于在 for 循环中使用列表,然后将列表转换回数据框。抱歉我的方法有限,我希望任何人都可以给我一个提示,甚至解决我的问题。如果您需要任何进一步的信息,请告诉我。提前致谢!

一个和我类似的问题: Populating a data frame in R in a loop

【问题讨论】:

    标签: r loops dplyr


    【解决方案1】:

    试试这个:

    library(stringr)
    library(dplyr)
    library(tidyr)
    library(magrittr)
    
    df %>%
      gather(Year, Values, 3:5) %>%
      mutate(Year = str_sub(Year, 2)) %>%
      select(ID, Year, Values) %>%
      group_split(ID) # split(.$ID) 
    
    # [[1]]
    # # A tibble: 3 x 3
    #     ID Year  Values
    #   <dbl> <chr>  <dbl>
    # 1     1 2019       1
    # 2     1 2020       2
    # 3     1 2021       3
    # 
    # [[2]]
    # # A tibble: 3 x 3
    #     ID Year  Values
    #   <dbl> <chr>  <dbl>
    # 1     2 2019       2
    # 2     2 2020       3
    # 3     2 2021       4
    # 
    # [[3]]
    # # A tibble: 3 x 3
    #     ID Year  Values
    #   <dbl> <chr>  <dbl>
    # 1     3 2019       3
    # 2     3 2020       4
    # 3     3 2021       5
    # 
    # [[4]]
    # # A tibble: 3 x 3
    #     ID Year  Values
    #   <dbl> <chr>  <dbl>
    # 1     4 2019       4
    # 2     4 2020       5
    # 3     4 2021       6
    # 
    # [[5]]
    # # A tibble: 3 x 3
    #     ID Year  Values
    #   <dbl> <chr>  <dbl>
    # 1     5 2019       5
    # 2     5 2020       6
    # 3     5 2021       7
    # 
    # [[6]]
    # # A tibble: 3 x 3
    #     ID Year  Values
    # <dbl> <chr>  <dbl>
    # 1     6 2019       6
    # 2     6 2020       7
    # 3     6 2021       8
    
    
    

    数据

    df <- data.frame(ID = c(1,2,3,4,5,6), Type = c("A","A","B","B","C","C"), `2019` = c(1,2,3,4,5,6),`2020` = c(2,3,4,5,6,7), `2021` = c(3,4,5,6,7,8))
    

    【讨论】:

    • 选择来自 dplyr。如果您添加library(dplyr),则可以。
    • select 来自 dplyr,但 dplyr 也来自 tidyverse ......因此来自@deepseefan 的建议应该可以正常工作。不幸的是,我收到以下错误:Error in group_split(., ID) : could not find function "group_split" 我仔细检查了这 2 个软件包以及它们是否已激活。
    • @TheEconomist,如果group_split 困扰您,请将其替换为split(.$ID) ,它应该可以工作。
    • 在更新我的 R 以及 dplyr 包后,我可以确认,您的两个变体都可以正常工作。感谢您的宝贵时间。
    【解决方案2】:
    library(magrittr)
    library(tidyr)
    library(dplyr)
    library(stringr)
    
    names(df) <- str_replace_all(names(df), "X", "") #remove X's from year names
    
    df %>%
      gather(Year, Values, 3:5) %>%
      select(ID, Year, Values) %>%
      group_split(ID)
    

    【讨论】:

    • 非常感谢您的回答。您对年份名称中的 X 非常敏感。不幸的是,我收到以下错误:Error in group_split(., ID) : could not find function "group_split"。我已经仔细检查了这两个包,如果它们真的被激活了..
    • 如果它不在您的dplyr 版本中,您可能没有最新版本。如果您没有 3.6.1,您可能需要更新您的软件包甚至 R。
    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 2023-03-19
    • 2020-05-25
    • 2020-05-01
    • 2022-08-06
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多