r - 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 的列。
解决方案
这是一种主要使用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
推荐阅读
- javascript - Java脚本,单击事件不起作用并且.style不起作用
- python - 使用python格式化加拿大邮政编码
- python - 类型对象“应用程序”没有属性“笔记本”
- excel - VBA Excel 2016 创建调用用户定义函数的宏
- mysql - 基于条件使用同一列的 SQL 日期差异
- android - 我的智能手机不再出现在运行/调试配置下拉菜单中
- next.js - 有没有办法使用 API 路由中间件在 Next.js 中实现 JSON:API?
- python - 设置 Tkinter 变量会引发“TypeError: set() missing 1 required positional argument: value'”错误消息
- python - KeyError:numpy中的'__builtins__'
- vba - 有没有办法将记录集更新包含在与表单其余部分相同的记录中?