You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将数据框中同一列的重复值合并至单行?附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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:26:21