2016-02-12 70 views
4

,我有以下的數據:tidyr價差不會彙總數據

> data <- data.frame(unique=1:9, grouping=rep(c('a', 'b', 'c'), each=3), value=sample(1:30, 9)) 
    > data 
     unique grouping value 
    1  1  a 15 
    2  2  a 21 
    3  3  a 26 
    4  4  b  8 
    5  5  b  6 
    6  6  b  4 
    7  7  c 17 
    8  8  c  1 
    9  9  c  3 

我想創建一個表,看起來像這樣:

 a  b c 
1  15  8 17 
2  21  6 1 
3  26  6 3 

我使用tidyr ::蔓延和沒有得到正確的結果:

> data %>% spread(grouping, value) 
    unique a b c 
1  1 15 NA NA 
2  2 21 NA NA 
3  3 26 NA NA 
4  4 NA 8 NA 
5  5 NA 6 NA 
6  6 NA 4 NA 
7  7 NA NA 17 
8  8 NA NA 1 
9  9 NA NA 3 

或者

> data %>% select(grouping, value) %>% spread(grouping, value) 
Error: Duplicate identifiers for rows (1, 2, 3), (4, 5, 6), (7, 8, 9) 

當一個組(c)的長度與其他組的長度不同時,是否有辦法做到這一點?

+0

你需要一個序列字段'數據%>%GROUP_BY(分組)%>%突變(ID = ROW_NUMBER())%>%選擇(-unique)%>%傳播(分組,值)' – akrun

回答

6

我們需要創建一個序列列以避免重複的標識符行錯誤。

library(tidyr) 
library(dplyr) 
data %>% 
    group_by(grouping) %>% 
    mutate(id = row_number()) %>% 
    select(-unique) %>% 
    spread(grouping, value) %>% 
    select(-id) 
#  a  b  c 
# (int) (int) (int) 
#1 15  8 17 
#2 21  6  1 
#3 26  4  3 
+1

這完美的作品! – Josh