根据另一个数据框中的行在r中使用for循环创建多个新数据框

时间:2019-10-15 13:56:35

标签: r loops dplyr

我有一个看起来像这样的数据框:

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”和“ Type”(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"))

此外,我了解了list,它可能有助于在for循环中使用列表,然后将列表转换回数据框。对不起,我的方法很有限,希望任何人都可以给我提示,甚至可以解决我的问题。如果您需要任何其他信息,请告诉我。预先感谢!

与我类似的问题: Populating a data frame in R in a loop

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

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)
相关问题