Создайте несколько новых фреймов данных на основе строк в другом фрейме данных с циклом for в r - PullRequest
1 голос
/ 15 октября 2019

У меня есть фрейм данных, который выглядит следующим образом:

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. Создайте новый data.frame для каждой строки в df 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и затем преобразуйте список обратно в фрейм данных. Извините за мой ограниченный подход, я надеюсь, что кто-нибудь может дать мне подсказку или даже решение моей проблемы. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Заранее спасибо!

Этот вопрос похож на мой: Заполнение фрейма данных в R в цикле

Ответы [ 2 ]

1 голос
/ 15 октября 2019
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)
1 голос
/ 15 октября 2019

Попробуйте это:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...