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的列数。
答案
我们可以用 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>
另一答案
这里有一个方法,主要使用 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,如何添加以前所有年份的列?的主要内容,如果未能解决你的问题,请参考以下文章