首页 > 解决方案 > R :将组中的分类行值组合为单个值

问题描述

我有一个类似于以下结构的数据框。

姓名 标签
一种 历史的
一种 喜剧
悲剧
C 喜剧
C 年轻的成年人

我想将它组合成一个数据框,所以所有具有共同名称的标签都出现在一行中。理想的输出看起来像这样。

姓名 标签
一种 “历史”、“喜剧”
“悲剧”
C “喜剧”、“年轻人”

到目前为止,我已经尝试将数据分组在一起,然后使用group_map().

library(tidyverse)

test_df <- data.frame(name = c('A', 'A', 'B', 'C', 'C'), 
                      labels = c('historical', 'comedy', 'tragedy', 'comedy', 'young adult'))

combined_label <- function(dt, ...) {
    print(dt[['labels']]) 
    dt['labels'] <- dt[['labels']]
    print(dt['labels']) 
    return(dt)}

test_df <- test_df %>%
    group_by(name) %>%
    group_map(combined_label)

但是,这种方法似乎不起作用。虽然 dt[['labels']]` 确实给出了所有值的一个因素(例如 c('historical', 'comedy')),但我似乎很难将它们组合在一起。我得到的输出是:

A tibble: 2 × 1
labels
<fct>
crime
horror
A tibble: 2 × 1
labels
<fct>
comedy
historical

任何帮助将不胜感激!

标签: rdplyr

解决方案


这是使用 dplyr 执行此操作的一种方法:

library(dplyr) 

d %>%
    group_by(Name) %>%
    summarise(Label1 = list(Label)) 

  Name  Label1   
  <chr> <list>   
1 A     <chr [2]>
2 B     <chr [1]>
3 C     <chr [2]>

另一种方式,使用aggregate

aggregate(Label ~ Name, data = d, FUN = c)

  Name               Label
1    A  historical, comedy
2    B             tragedy
3    C comedy, young adult

数据

d <- structure(list(Name = c("A", "A", "B", "C", "C"), 
                    Label = c("historical", "comedy", "tragedy", 
                              "comedy", "young adult")), 
               row.names = c(NA, -5L), class = "data.frame")

推荐阅读