我有一个看起来像这样的数据框:
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循环中使用列表,然后将列表转换回数据框。对不起,我的方法很有限,希望任何人都可以给我提示,甚至可以解决我的问题。如果您需要任何其他信息,请告诉我。预先感谢!
答案 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)