-1

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

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)

在尝试传播资源时出现错误:

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

Error: Duplicate identifiers for rows 
4

2 回答 2

0

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

 stocks %>%
     gather(company, value,-time) %>%
     group_by(company) %>% 
     mutate(i = row_number()) %>% 
     spread(company, value)
于 2016-11-17T15:17:43.933 回答
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

我们看到time和列包含相同的内容,即公司在该日期company有多个观察值。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
于 2016-11-17T15:24:12.463 回答