R语言按指定列去重后合并其余列唯一值的实现方法求助
可用解决方案(适配19列、500万行大数据量场景)
所有方案均支持自动处理除分组列V1之外的所有列,无需手动指定剩余列名,自动完成唯一值合并。
1. R 方案(推荐R用户使用,data.table性能极强,适配千万级行数据)
使用data.table包的分组聚合能力,读写大文件速度远快于base R和tidyverse系列工具:
# 加载包 library(data.table) # 读取大文件,自动识别分隔符 dt <- fread("你的输入文件路径.txt") # 按V1分组,其余所有列取唯一值后用|拼接 res <- dt[, lapply(.SD, function(x) paste(unique(x), collapse = "|")), by = V1] # 输出结果 fwrite(res, "你的输出文件路径.txt", sep = "\t")
2. Python 方案
如果追求更低内存占用、更快处理速度,推荐使用polars库,比pandas更适配超大数据表:
Polars 版本
import polars as pl # 读取文件 df = pl.read_csv("你的输入文件路径.txt", separator="\t") # 按V1分组,所有列取唯一值后拼接 res = df.group_by("V1", maintain_order=True).agg( pl.all().unique().map_elements(lambda x: "|".join(x), return_dtype=str) ) # 输出结果 res.write_csv("你的输出文件路径.txt", separator="\t")
Pandas 版本
import pandas as pd # 读取文件,分隔符根据实际格式调整,空白分隔用\s+,制表符用\t df = pd.read_csv("你的输入文件路径.txt", sep="\s+") # 分组聚合 res = df.groupby("V1", as_index=False).agg(lambda x: "|".join(x.unique())) # 输出 res.to_csv("你的输出文件路径.txt", sep="\t", index=False)
3. Shell awk 方案(无需额外安装环境,直接命令行运行)
awk ' NR==1 {print; next} { for(i=2;i<=NF;i++){ if(!seen[$1][i][$i]++){ val[$1][i] = (val[$1][i] ? val[$1][i]"|" : "") $i } } } END{ for(v1 in val){ printf "%s", v1 for(i=2;i<=NF;i++){ printf "\t%s", val[v1][i] } print "" } } ' 输入文件.txt | sort -k1,1 > 输出文件.txt
内容的提问来源于stack exchange,提问作者Abbey
相关产品推荐
相关产品推荐

