如何用R语言删除重复行并根据首列内容合并数据集内容?
问题1:如何使用R语言删除数据集中的重复行?
我平时处理重复行常用这几个办法,简单又好用:
base R原生方法
- 用
unique()函数:直接传入数据集,它会自动返回去重后的结果,比如:# 假设你的数据集叫df df_unique <- unique(df) - 用
duplicated()函数:这个函数会返回一个逻辑向量,标记哪些行是重复的,我们可以用它来筛选出不重复的行:
要是想保留最后一次出现的重复行,还可以加个df_unique <- df[!duplicated(df), ]fromLast = TRUE参数:df_unique <- df[!duplicated(df, fromLast = TRUE), ]
- 用
dplyr包方法(更直观)
如果你用tidyverse系列的包,distinct()函数简直是神器,不仅能去重,还能指定保留哪些列:library(dplyr) # 完全去重 df_unique <- df %>% distinct() # 只根据某几列去重,保留其他列的第一行 df_unique <- df %>% distinct(col1, col2, .keep_all = TRUE)
问题2:根据第一列内容合并对应内容
虽然你没贴原始数据集和具体的期望格式,但我猜大概率是要按第一列分组,把同一组的其他列内容合并到一起,比如把同一个分类下的文本拼接起来。我给你举个常见场景的例子:
假设你的原始数据是这样的:
df <- data.frame( 分类 = c("水果", "水果", "蔬菜", "蔬菜"), 名称 = c("苹果", "香蕉", "白菜", "萝卜") )
想要得到的结果是每行对应一个分类,名称列合并成“苹果,香蕉”这种格式,那可以这么做:
用dplyr包实现
library(dplyr) library(stringr) # 用来拼接字符串 df_merged <- df %>% group_by(分类) %>% # 按第一列(这里是“分类”列)分组 summarise(合并后的名称 = str_c(名称, collapse = ", ")) %>% # 拼接内容 ungroup()base R原生方法
用aggregate()函数也能搞定:df_merged <- aggregate(名称 ~ 分类, data = df, FUN = function(x) paste(x, collapse = ", "))
要是你的需求和这个例子不一样,也可以调整函数里的拼接逻辑,比如换成换行符或者其他分隔符都没问题~
内容的提问来源于stack exchange,提问作者Chamil Rathnayake




