首页 > 解决方案 > R Studio - 带有名称和年份的数据框,如何添加以前所有年份的列?

问题描述

我会尽力解释清楚...

这是我正在使用的示例数据框:

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"))

现在我收集了这些年来不同人的成绩(例如,艾莉从 2000 年到 2003 年的成绩)。对于我的数据框中的每一行,我想为学生在前几年的表现添加列。因此,Ellie 2000 的行在所有这些列中都将具有 NA,因为没有关于 Ellie 2000 年前的数据。带有 Ellie 2001 的行将在标题为“一年前”的列中显示 Ellie 的 2000 成绩,其余部分为 NA。带有 Ellie 2002 的行将在标题为“一年前”的列中显示 Ellie 的 2001 年成绩,在“两年前”中显示她 2000 年的成绩等。

关于如何做到这一点的任何见解?谢谢!

编辑:这是 Ellie 之前的数据框(尽管我想遍历数据框并对所有行执行此操作,现在只是 Ellie 行):

name . . . year . . . grade

Ellie. . . 2000 . . . A

Ellie. . . 2001 . . . B

Ellie. . . 2002 . . . D 

Ellie. . . 2003 . . . C

以及操作 Ellie 行后的数据框:

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 

最终的列数(即 y-what number)将取决于最长的历史记录。因此,在这种情况下,Ellie 在长达四年的数据中拥有最多的条目,因此数据集中的每个人都会有 y-1、y-2 和 y-3 的列。

标签: rloopsdata-manipulationdplyr

解决方案


这是一种主要使用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   

推荐阅读