按列分组并将一列汇总为列表

24
我有一个像这样的数据框:
sample_df<-data.frame(
   client=c('John', 'John','Mary','Mary'),
   date=c('2016-07-13','2016-07-13','2016-07-13','2016-07-13'),
   cluster=c('A','B','A','A'))

#sample data frame
   client date         cluster
1  John   2016-07-13    A 
2  John   2016-07-13    B 
3  Mary   2016-07-13    A 
4  Mary   2016-07-13    A             

我希望把它转换成另一种格式,就像这样:

#ideal data frame
   client date         cluster
1  John   2016-07-13    c('A,'B') 
2  Mary   2016-07-13    A 

'cluster'列将是一个列表,如果某个客户在同一日期属于不同的集群。

我以为我可以用以下命令使用dplyr包来完成:

library(dplyr)
ideal_df<-sample %>% 
    group_by(client, date) %>% 
    summarize( #some anonymous function)

然而,在这种情况下,我不知道如何编写匿名函数。是否有一种方法可以将数据转换为理想的格式?

1个回答

36

在按'client'分组后,我们可以使用toString将'cluster'中的unique元素连接在一起。

r1 <- sample_df %>% 
         group_by(client, date) %>%
         summarise(cluster = toString(unique(cluster)))

另一个选项是创建一个列表列。

r2 <- sample_df %>%
         group_by(client, date) %>% 
         summarise(cluster = list(unique(cluster)))

我们可以进行unnest操作

library(tidyr)
r2 %>%
    ungroup %>%
     unnest()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接