如何将数据框中同一列的重复值合并至单行?附R语言示例代码
合并数据框中相同userID的行
嘿,我来帮你搞定这个把相同userID的记录合并到单行的需求!先把你给出的示例数据补全,方便咱们测试:
# 生成示例数据 userid <- c(415,375,415,415,513,64,375,415,317,375) rating <- c(4,4,4,5,5,4,3,5,4,5) title <- c("GoldenEye (1995)","GoldenEye (1995)","Babe (1995)", "Usual Suspects, The (1995)", "Braveheart (1995)","Braveheart (1995)", "Braveheart (1995)", "Braveheart (1995)","Apollo 13 (1995)","Apollo 13 (1995)") data <- data.frame(userid, rating, title)
接下来介绍两种常用的实现方法,你可以根据自己的习惯选择:
方法1:使用tidyverse工具包(dplyr + tidyr)
这是R中处理数据框最常用的一套工具,代码可读性很强:
首先需要加载tidyverse包(如果没安装先运行install.packages("tidyverse")):
library(tidyverse) # 按userid分组,合并rating和title列 merged_data <- data %>% group_by(userid) %>% summarise( ratings = paste(as.character(rating), collapse = ", "), titles = paste(title, collapse = ", ") ) %>% ungroup()
代码解释:
group_by(userid):把数据按userid分成不同的组summarise():对每个组进行汇总,用paste()把同一组的rating和title用逗号分隔合并成字符串ungroup():取消分组状态,得到普通的数据框
运行后你会得到这样的结果:
# A tibble: 5 × 3 userid ratings titles <dbl> <chr> <chr> 1 64 4 Braveheart (1995) 2 317 4 Apollo 13 (1995) 3 375 4, 3, 5 GoldenEye (1995), Braveheart (1995), Apollo 13 (1995) 4 415 4, 4, 5, 5 GoldenEye (1995), Babe (1995), Usual Suspects, The (1995), Braveheart (1995) 5 513 5 Braveheart (1995)
方法2:使用data.table(适合大数据集)
如果你的数据量很大,data.table的处理速度会比tidyverse快很多,用法也很简洁:
先安装并加载data.table包(没安装的话运行install.packages("data.table")):
library(data.table) # 转换为data.table格式 dt <- as.data.table(data) # 按userid分组合并 merged_dt <- dt[, .(ratings = paste(as.character(rating), collapse = ", "), titles = paste(title, collapse = ", ")), by = userid]
运行后得到的结果和方法1是一致的,只是格式为data.table,你可以用as.data.frame(merged_dt)转成普通数据框。
如果你希望保留rating的数值形式(比如存成列表),也可以把paste()换成list(rating),这样每个userid对应的ratings是一个数值列表,titles同理:
# 合并为列表形式 merged_data_list <- data %>% group_by(userid) %>% summarise( ratings = list(rating), titles = list(title) ) %>% ungroup()
这样你就可以根据自己的需求选择合适的合并方式啦!
内容的提问来源于stack exchange,提问作者Rodaina Mohamed
相关产品推荐
相关产品推荐

