R "unnesting" dataframe приводит к ошибке - PullRequest
0 голосов
/ 26 июня 2019

У меня есть набор данных, который выглядит следующим образом -

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 = "_")

Ошибка: все вложенные столбцы должны иметь одинаковое количество элементов.

Я понял, что это потому, что на новом сайте нет данных за один день.

Я хотел бы знать, существует ли альтернативный подход к обработке этого нового набора данных и достижению того же формата вывода.

1 Ответ

1 голос
/ 27 июня 2019

Проверка

new_dataset %>% 
  nest(Score, Average, .key = 'value_col') %>% 
  spread(key = Date, value = value_col)

Для нового сайта вы не предоставили никаких данных для нового сайта на 2019-03-31, и, следовательно, неудачное завершение.

Лучше использовать что-то вроде

new_dataset %>% 
  gather(key, value, -Site, -Date, -Question) %>% 
  mutate(key = str_c(Date, "_", key)) %>% 
  select(-Date) %>% 
  spread(key, value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...