R语言:以拼接为聚合函数实现文本分组聚合
嘿,这个需求在数据处理里挺常见的,我给你分享两种实用的方案,分别对应你想要的聚合后data.frame和目标列表格式:
方法1:生成聚合后的data.frame
这里有两种主流实现方式,你可以根据自己的习惯选择:
使用dplyr包(tidyverse风格)
dplyr是处理数据框的利器,代码可读性很高:
# 先加载dplyr包,如果没装的话先运行install.packages("dplyr") library(dplyr) # 定义你的原始数据框 df <- data.frame(sid = c(1, 1, 2, 2), text = c("hello", "world", "whats", "up")) # 按sid分组,合并text列 agg_df <- df %>% group_by(sid) %>% summarize(text = paste(text, collapse = " "), .groups = "drop") # 查看结果 agg_df
运行后你会得到:
sid text 1 1 hello world 2 2 whats up
注:.groups = "drop"是为了分组后取消分组状态,避免后续操作出现警告,R版本较新的话建议加上。
使用Base R(无需额外包)
如果不想加载第三方包,用base R的aggregate函数也能搞定:
# 定义原始数据框 df <- data.frame(sid = c(1, 1, 2, 2), text = c("hello", "world", "whats", "up")) # 聚合操作 agg_df_base <- aggregate(text ~ sid, data = df, FUN = function(x) paste(x, collapse = " ")) # 查看结果 agg_df_base
得到的结果和上面完全一致。
方法2:生成对应索引的列表
如果更想要列表格式,有两种简单的方式:
从聚合后的data.frame转换
直接提取聚合后的text列转成列表即可:
# 用上面得到的agg_df text_list <- as.list(agg_df$text) text_list
输出:
[[1]] [1] "hello world" [[2]] [1] "whats up"
直接用tapply生成列表
一步到位,不需要先生成data.frame:
text_list <- unname(tapply(df$text, df$sid, function(x) paste(x, collapse = " "))) text_list
注:unname()是为了去掉列表元素的名字(默认会保留sid作为名字),如果你不需要名字的话加上就行,去掉后列表元素会是无名的索引形式,正好符合你的需求。
内容的提问来源于stack exchange,提问作者Christopher Costello
相关产品推荐
相关产品推荐

