这是一个类似于我正在使用的示例数据框:
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
很抱歉,如果此问题已经发布。我花了几个小时搜索并没有答案。
答案 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
或者,您可以使用dcast
或reshape2
中的data.table
作为
reshape2::dcast(df, ID~Fruit, value.var = "n", fill = 0)