R“取消嵌套”数据帧导致错误

时间:2019-06-26 17:24:19

标签: r

我有一个看起来像这样的数据集-

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列的基础上扩展AverageDate列。

我使用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 个答案:

答案 0 :(得分:1)

检查

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)