r - 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
任何帮助将不胜感激!
解决方案
这是使用 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")
推荐阅读
- android - 如何在谷歌地图上显示单个地址的子地址点
- indexing - 调查慢查询和索引
- php - WordPress 中 file_get_contents 函数的替代
- sql - PostgreSQL 索引表性能突然下降
- linux - 有没有办法通过 redis-cli 设置日志文件但不编辑 redis.config 文件?
- android - 拆分安装 API 不可用。安装动态功能 Android Studio 时出现错误代码 - 5
- teradata - 如何仅更新 Teradata 日期列中的年份
- db2 - 设置 DB2 和 IBM Data Studio 的无尽麻烦
- javascript - 选择选项无法使用 codeigniter 在数据库中提交
- javascript - 如何为 html 表单获取 db 唯一 ID,并在 css 和 jquery 中使用它来为 django 的每个表单数据制作动态表单?