2016-02-12 68 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