将列的唯一值转换为包含其他列中对应值的多个列

时间:2016-10-25 15:06:11

标签: r dataframe data-manipulation

这是一个类似于我正在使用的示例数据框:

set.seed(74.3)
df<-data.frame(ID=sample(c(1000:1004),size=20,replace=T),
Fruit=sample(c("Apple","Banana","Pear","Orange","Plum"),size=20,replace=T))
library(dplyr) 
df <- df %>%
group_by(ID,Fruit) %>% 
summarise(n=n())


      ID  Fruit     n
   (int) (fctr) (int)
1   1000 Banana     1
2   1000 Orange     3
3   1000   Pear     1
4   1001 Banana     1
5   1001   Plum     2
6   1002 Banana     1
7   1003 Banana     1
8   1003 Orange     2
9   1003   Pear     1
10  1003   Plum     1
11  1004  Apple     2
12  1004 Banana     2
13  1004 Orange     1
14  1004   Pear     1

如何转置Fruit和n列并对ID进行分组,以便每种类型的水果都是一个单独的列,其中包含与ID对应的水果数?

  ID  Banana  Orange  Pear  Plum  Apple  
1000     1       3      1     0     0
1001     1       0      0     2     0
1002     1       0      0     0     0
1003     1       2      1     1     0
1004     2       1      1     0     2

很抱歉,如果此问题已经发布。我花了几个小时搜索并没有答案。

1 个答案:

答案 0 :(得分:3)

使用tidyr

library(tidyr); 
spread(df, Fruit, n, fill=0)

Source: local data frame [5 x 6]
Groups: ID [5]

     ID Apple Banana Orange  Pear  Plum
* <int> <dbl>  <dbl>  <dbl> <dbl> <dbl>
1  1000     0      1      3     1     0
2  1001     0      1      0     0     2
3  1002     0      1      0     0     0
4  1003     0      1      2     1     1
5  1004     2      2      1     1     0

或者,您可以使用dcastreshape2中的data.table作为

reshape2::dcast(df, ID~Fruit, value.var = "n", fill = 0)