R Studio - Dataframe с именами и годами, как добавить столбцы за все предыдущие годы? - PullRequest
1 голос
/ 16 июня 2020

Я постараюсь изо всех сил объяснить это ...

Вот образец фрейма данных, который я использую:

df <- data.frame("name" = c("Ellie", "Ellie", "Ellie", "Ellie", "Nora", "Nora", "Nora", "Jake", "Jake"), 
             "year" = c(2000, 2001, 2002, 2003, 2002, 2003, 2004, 2000, 2001),
             "grade" = c("A", "B", "D", "C", "C", "D", "C", "B", "B"))

Прямо сейчас у меня есть коллекция оценок разных люди с годами (например, оценки Ell ie с 2000 по 2003). Для каждой строки в моем фрейме данных я хочу добавить столбцы, показывающие, как учащийся делал в предыдущие годы. Итак, строка с Ell ie 2000 будет иметь NA во всех этих столбцах, поскольку нет данных о Ell ie до 2000 года. Строка с Ell ie 2001 будет иметь оценку 2000 Ell ie в столбце, озаглавленном что-то вроде «один год go», а остальное - NA. В строке с Ell ie 2002 будет оценка Ell ie за 2001 год в столбце под названием «один год go», ее оценка за 2000 год в «два года go» и т. Д. c.

Есть идеи, как это сделать? Спасибо!

РЕДАКТИРОВАТЬ: здесь фрейм данных раньше только для Ell ie (хотя я хотел бы l oop через фрейм данных и сделать это для всех строк, теперь только Ell ie строк):

name . . . year . . . grade

Ellie. . . 2000 . . . A

Ellie. . . 2001 . . . B

Ellie. . . 2002 . . . D 

Ellie. . . 2003 . . . C

И фрейм данных после манипулирования Ell ie строк:

name . . . year . . . grade . . . y-1 grade . . . y-2 grade . . . y-3 grade

Ellie. . . 2000 . . . A . . .  . . NA . . . . . . NA . . . . . . . NA

Ellie. . . 2001 . . . B . . .  . . A . . . . . . NA . . . . . . . NA

Ellie. . . 2002 . . . D . . .  . . B . . . . . . A . . . . . . . NA

Ellie. . . 2003 . . . C . . .  . . D . . . . . . B . . . . . . . A 

Окончательное количество столбцов (ie. Y-какое число) будет зависеть от самого длинного история. Таким образом, в этом случае Ell ie имеет наибольшее количество записей за период до четырех лет, поэтому каждый в наборе данных будет иметь столбцы для y-1, y-2 и y-3.

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Мы могли бы использовать shift из data.table

library(data.table)
setDT(df)[, paste0('y', 1:3) := shift(grade, n = 1:3),.(name)]
df
#    name year grade   y1   y2   y3
#1: Ellie 2000     A <NA> <NA> <NA>
#2: Ellie 2001     B    A <NA> <NA>
#3: Ellie 2002     D    B    A <NA>
#4: Ellie 2003     C    D    B    A
#5:  Nora 2002     C <NA> <NA> <NA>
#6:  Nora 2003     D    C <NA> <NA>
#7:  Nora 2004     C    D    C <NA>
#8:  Jake 2000     B <NA> <NA> <NA>
#9:  Jake 2001     B    B <NA> <NA>
1 голос
/ 16 июня 2020

Вот способ использования в основном tidyverse функций.

library(dplyr)
library(purrr)

df %>%
  arrange(name, year) %>%
  group_by(name) %>%
  mutate(p_grade = purrr::map(year, ~rev(grade[.x > year])[1:(n() - 1)])) %>%
  unnest(p_grade) %>%
  group_by(year, grade, .add = TRUE) %>%
  #In dplyr < 1.0.0 use add = TRUE
  #group_by(year, grade, add = TRUE) %>%
  mutate(col = paste0('y', row_number())) %>%
  pivot_wider(names_from = col, values_from = p_grade)


#  name   year grade y1    y2    y3   
#  <chr> <dbl> <chr> <chr> <chr> <chr>
#1 Ellie  2000 A     NA    NA    NA   
#2 Ellie  2001 B     A     NA    NA   
#3 Ellie  2002 D     B     A     NA   
#4 Ellie  2003 C     D     B     A    
#5 Jake   2000 B     NA    NA    NA   
#6 Jake   2001 B     B     NA    NA   
#7 Nora   2002 C     NA    NA    NA   
#8 Nora   2003 D     C     NA    NA   
#9 Nora   2004 C     D     C     NA   
...