![](/img/trans.png)
[英]Create multiple Dataframes based on the Dates of another Dataframe in R
[英]Create multiple new dataframes based on rows in another dataframe with a for loop in r
我有一個看起來像這樣的 dataframe:
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"))
此外,我閱讀了有關列表的信息,它可能有助於在 for 循環中使用列表,然后將列表轉換回 dataframe。 抱歉我的方法有限,我希望任何人都可以給我一個提示甚至解決我的問題。 如果您需要任何進一步的信息,請告訴我。 提前致謝!
一種與我類似的問題: 在循環中填充 R 中的數據框
嘗試這個:
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))
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.