У меня есть набор данных, который выглядит следующим образом -
dataset = data.frame(Site=c(rep('A',6),rep('B',6)),
Date=c(rep(c('2019-05-31','2019-04-30','2019-03-31'),4)),
Question=c(rep('Q1',3),rep('Q2',3)),
Score=runif(12,0.5,1),
Average=runif(12,0.5,1))
Моя цель - расширить столбцы Score
и Average
на основе столбца Date
.
Используя tidyverse
, я манипулирую данными -
library(tidyverse)
dataset %>%
nest(Score, Average, .key = 'value_col') %>%
spread(key = Date, value = value_col) %>%
unnest(.preserve = c("Site", "Question"), .sep = "_")
И это приводит к окончательному фрейму данных, который я ищу -
Site Question 2019-03-31_Score 2019-03-31_Average 2019-04-30_Score 2019-04-30_Average 2019-05-31_Score 2019-05-31_Average
1 A Q1 0.5070755 0.6948877 0.8046608 0.8359777 0.7653232 0.5259696
2 A Q2 0.5255425 0.9482262 0.9796590 0.7612117 0.9819698 0.7710665
3 B Q1 0.6963277 0.5416473 0.7753426 0.6710344 0.8219699 0.5310356
4 B Q2 0.9993356 0.6293783 0.8125886 0.5007390 0.6385580 0.5238838
Однако, когда я добавляю новый сайт к исходному фрейму данных ...
new_site= data.frame(Site=c(rep('C',4)),
Date=c('2019-05-31','2019-03-31','2019-05-31','2019-03-31'),
Question=c(rep('Q1',2),rep('Q2',2)),
Score=runif(4,0.5,1),
Average=runif(4,0.5,1))
new_dataset = rbind(dataset,new_site)
и перезапустить манипулирование данными на новом наборе данных, я получаю следующую ошибку ...
library(tidyverse)
new_dataset %>%
nest(Score, Average, .key = 'value_col') %>%
spread(key = Date, value = value_col) %>%
unnest(.preserve = c("Site", "Question"), .sep = "_")
Ошибка: все вложенные столбцы должны иметь одинаковое количество элементов.
Я понял, что это потому, что на новом сайте нет данных за один день.
Я хотел бы знать, существует ли альтернативный подход к обработке этого нового набора данных и достижению того же формата вывода.