2016-11-17 5 views
-1

Я создал кадр данных, используя следующий код:сбора и распространение функция в R

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 
+0

У вас есть столбец без имени '= rnorm (50,20,2)' – akrun

+0

, и код не запускается, так как он содержит синтаксическую ошибку. –

+0

Вам нужен столбец последовательностей, т. Е. 'Акции%>% собираются (компания, значение, время)%>% group_by (компания)%>% mutate (i = row_number())%>% spread (компания, значение)' It может быть либо 'company', либо' time' в 'group_by'. Поскольку ожидаемого результата нет, он не уверен – akrun

ответ

0

Нам нужен столбец последовательности, чтобы избежать ошибок Duplicate identifiers...

stocks %>% 
    gather(company, value,-time) %>% 
    group_by(company) %>% 
    mutate(i = row_number()) %>% 
    spread(company, value) 
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