我使用以下代码创建了一个数据框:
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
答案 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
我们发现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