R Studio - 有名字和年份的Dataframe,如何添加以前所有年份的列?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R Studio - 有名字和年份的Dataframe,如何添加以前所有年份的列?相关的知识,希望对你有一定的参考价值。

我会尽力解释清楚的...

这是我正在使用的一个示例数据框架。

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

现在我有一个不同的人多年来的成绩集合(比如Ellie从2000年到2003年的成绩)。对于我的数据框架中的每一行,我都想为该学生在前几年的成绩添加列。因此,在Ellie 2000的那一行,所有这些列中都会有NA,因为没有关于Ellie在2000年之前的数据。在Ellie 2001的行中,Ellie的2000年成绩会出现在类似于 "一年前 "这样的列中,其余的数据则为NAs。2002年的那一行,Ellie的2001年的成绩会在 "一年前 "一栏中,她的2000年成绩会在 "两年前",等等。

对如何做这件事有什么见解吗?谢谢

EDIT: 这是之前的数据框架,只针对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 -什么数)取决于最长的历史记录。所以在这种情况下,Ellie在最多四年的数据上有最多的条目,所以数据集中的每个人都会有y-1、y-2和y-3的列数。

答案

我们可以用 shiftdata.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>
另一答案

这里有一个方法,主要使用 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   

以上是关于R Studio - 有名字和年份的Dataframe,如何添加以前所有年份的列?的主要内容,如果未能解决你的问题,请参考以下文章

Android studio 中如何批量引入图片。一大堆图片!

如何使用国家和年份格式化数据以在 R 中进行回归?

地区和年份得分之间的R中的T检验

r 按 ID 按年份折叠

找出R中年份和公司名称的平均价值

我如何按时间顺序绘制 R 中年份变化的周?