Учитывая следующие данные:
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
У вас есть столбец без имени '= rnorm (50,20,2)' – akrun
, и код не запускается, так как он содержит синтаксическую ошибку. –
Вам нужен столбец последовательностей, т. Е. 'Акции%>% собираются (компания, значение, время)%>% group_by (компания)%>% mutate (i = row_number())%>% spread (компания, значение)' It может быть либо 'company', либо' time' в 'group_by'. Поскольку ожидаемого результата нет, он не уверен – akrun