在R

时间:2016-11-17 15:01:01

标签: r tidyverse

我使用以下代码创建了一个数据框:

stocks <- data.frame(time = as.Date('2009-01-01') + 0:9,
                   X = rnorm(50, 20, 1),
                    Y= rnorm(50, 20, 2),= rnorm(50, 20, 2),   
                   Z=rnorm(50,20,4))
)

我已将聚集功能应用于数据框:

res<-stocks%<%gather(company, value,-time)

在尝试传播res时遇到错误:

spread(data=res, key=company , value = value)    

Error: Duplicate identifiers for rows 

2 个答案:

答案 0 :(得分:0)

我们需要一个序列列来避免错误Duplicate identifiers...

 stocks %>%
     gather(company, value,-time) %>%
     group_by(company) %>% 
     mutate(i = row_number()) %>% 
     spread(company, value)

答案 1 :(得分:0)

鉴于以下数据:

stocks <- data.frame(time = as.Date('2009-01-01') + 0:9,
                     X    = rnorm(50, 20, 1),
                     Y    = rnorm(50, 20, 2),
                     Z    = rnorm(50, 20, 2))

我像您一样应用gather并在结果上运行spread

stocks %>% gather(company, value, -time) %>% spread(company, value)
Error: Duplicate identifiers for rows (1, 11, 21, 31, 41), (2, 12, 22,

当我们查看行c(1, 11, 21, etc)

         time company    value
1  2009-01-01       X 20.69259
11 2009-01-01       X 20.50856
21 2009-01-01       X 17.83796

我们发现timecompany列包含相同的内容,即该日期公司X有多个观察结果。这会导致您看到错误,因为spread无法一致地聚合。

您可以通过添加一个索引每个日期和公司的值的附加列来解决此问题:

res = stocks %>% gather(company, value, -time) %>% 
                 group_by(company, time) %>% 
                 mutate(i = row_number()) %>% 
                 spread(company, value)

并检查我们是否再次stocks

all.equal(stocks %>% arrange(time), res %>% select(-i) %>% as.data.frame())
[1] TRUE