如何结合mutate()、lapply()与duplicated()识别分组列表重复字符
识别分组列表中的重复字符解决方案
你遇到的FUN缺失错误,通常是因为在mutate()中使用lapply()时没有正确定义并传递处理函数,或者参数格式不对。针对4万行的数据集,以下是几种高效可行的实现方法:
方法1:Tidyverse 风格(推荐)
使用purrr::map()替代lapply(),它和dplyr的兼容性更好,语法更简洁,处理大规模数据效率稳定:
library(dplyr) library(purrr) # 生成包含所有重复实例的列表列 df <- df %>% mutate(duplicated_codes = map(present_codes, ~ .x[duplicated(.x)])) # 如果需要去重后的重复字符(每个重复值仅保留一次) df <- df %>% mutate(duplicated_codes = map(present_codes, ~ unique(.x[duplicated(.x)])))
方法2:修正 Base R 写法
若坚持用Base R,需明确给lapply()传递处理函数,不能省略FUN参数:
library(dplyr) df <- df %>% mutate(duplicated_codes = lapply(present_codes, function(x) x[duplicated(x)])) # 同样可加入unique()去重重复值 df <- df %>% mutate(duplicated_codes = lapply(present_codes, function(x) unique(x[duplicated(x)])))
大规模数据效率优化
针对4万行的数据集,若present_codes内的列表元素数量较多,可改用data.table进一步提升速度:
library(data.table) setDT(df) df[, duplicated_codes := lapply(present_codes, function(x) unique(x[duplicated(x)]))]
说明
x[duplicated(x)]会提取列表中从第二次出现开始的重复字符(比如列表c("A","A","B")会返回"A")- 加上
unique()后,会得到每组中所有重复过的唯一字符(比如列表c("A","A","A"),前者返回c("A","A"),后者返回"A",可按需选择)
内容的提问来源于stack exchange,提问作者Bettina
相关产品推荐
相关产品推荐

