2016-11-17 26 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) 

而試圖傳播RES我得到的錯誤:

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

Error: Duplicate identifiers for rows 
+0

你沒有名字有一個列'= rnorm(50,20,2)' – akrun

+0

並且代碼不會運行,因爲它包含語法錯誤。 –

+0

您需要一個序列列,即'股票%>%聚集(公司,價值,時間)%>%group_by(company)%>%mutate(i = row_number())%>%spread(company,value)'It可以是'group_by'中的'company'或'time'。由於沒有預期的產出,所以不確定 – 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 

我們看到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