Изменение формы данных из преобразованной таблицы XML - PullRequest
1 голос
/ 16 февраля 2020

У меня есть фрейм данных, преобразованный из XML в CSV. Теперь проблема в том, что мне нужно сделать лист Excel из этих данных, но эти данные - полный беспорядок. Мне было интересно, не могли бы вы помочь найти коды R. для решения проблемы.

Я подробно объясню проблему. Представьте, что набор данных выглядит примерно так:

student.data <- data.frame(id = c(1:17),
                       student_id = c(1111,"","","","","","","","","2222","","","","","","",""),
                       exam_id =c("",10,10,20,20,20,30,40,40,"",10,10,10,20,30,40,40), 
                       status = c("","AAA","BBB","CCC","DDD","FFF","GGG","AAA","GGG","","BBB","HHH","MMM","FFF","DDD","GGG","GGG"))

результат должен быть следующим:

enter image description here Я знаю, что это немного сложно, но заранее спасибо за помощь.

1 Ответ

1 голос
/ 16 февраля 2020

Мы можем конвертировать бланк (""). элементы из 'student_id' в NA (na_if), затем используйте fill, чтобы заменить элементы NA соседним элементом, отличным от NA, сгруппированным по 'student_id', 'exam_id', получить элементы unique 'status', которые не являются пустыми ("") и вставляют их в одну строку (toString), filter из любых строк, где есть пробелы, и преобразуют вывод в «широкий» формат с помощью pivot_wider

library(dplyr)
library(tidyr)
library(purrr)
student.data %>% 
  mutate(student_id = na_if(student_id, "")) %>%
 fill(student_id) %>%
 group_by(student_id, exam_id) %>% 
 summarise(status  =  toString(unique(status[status!= '']))) %>% 
 filter_at(vars(exam_id, status), any_vars(. != '')) %>% 
 pivot_wider(names_from = exam_id, values_from = status)
# A tibble: 2 x 5
# Groups:   student_id [3]
#  student_id `10`          `20`          `30`  `40`    
#  <fct>      <chr>         <chr>         <chr> <chr>   
#1 1111       AAA, BBB      CCC, DDD, FFF GGG   AAA, GGG
#2 2222       BBB, HHH, MMM FFF           DDD   GGG     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...