首页 > 解决方案 > R通过标识符合并列

问题描述

我有一个很长的数据集,其中包含多个学期的学生成绩和课程。每个学生都有许多 NA 和许多行。我希望每个学生有一个长行来填写这些 NA,但保持相同的列名。

这是一个示例:

library(tidyverse)
sample <- tibble(student = c("Corey", "Corey", "Sibley", "Sibley"),
                 fall_course_1 = c("Math", NA, "Science", NA),
                 fall_course_2 = c(NA, "English", NA, NA),
                 fall_grade_1 = c(90, NA, 98, NA),
                 fall_grade_2 = c(NA, 60, NA, NA))

这就是我希望它看起来的样子:

library(tidyverse)
answer <- tibble(student = c("Corey", "Sibley"),
                 fall_course_1 = c("Math", "Science"),
                 fall_course_2 = c("English", NA),
                 fall_grade_1 = c(90, 98),
                 fall_grade_2 = c(60, NA))

有些学期,有些学生上很多课,有些只上一门。我尝试过使用 coalesce(),但我无法弄清楚。任何帮助,将不胜感激!

标签: rreshapetidyrdata-cleaningcoalesce

解决方案


应该这样做,将数据旋转长,删除 na,然后将其旋转回宽。

您需要暂时将数值转换为字符,以便它们可以与课程标签放在同一列中,然后 type_convert() 是一种将它们重新放回的懒惰方式。

library(dplyr)
library(tidyr)
library(readr)

reshaped <- sample %>%
  mutate_if(is.numeric, as.character) %>%
  pivot_longer(-student) %>% 
  drop_na() %>% 
  pivot_wider(student, names_from = name, values_from = value) %>% 
  type_convert()

推荐阅读