簡體   English   中英

基於另一個 dataframe 中的行創建多個新數據幀,並在 r 中使用 for 循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM