如何在整个DataFrame中拆分字符串并保留唯一值?
如何将单列去重字符串的逻辑扩展到整个DataFrame?
我已经实现了针对单个DataFrame列的处理代码,能拆分含重复术语的字符串并保留唯一值,代码如下:
data$`H021-FYR8SS` <- sapply(data$`H021-FYR8SS`, function(x) paste(unique(unlist(str_split(x,", "))), collapse = "; "))
这段代码运行正常,但现在需要把这个逻辑应用到整个DataFrame的所有列。以下是输入和期望输出示例:
输入示例
data <- data.frame( `H021-2YTE1K` = c(" ", " ", " ", " ", " ", " ", " ", " ", "SNV"), `H021-4YZREF` = c("SNV, SNV, SNV", "SNV", "SNV", "SNV, SNV", "SNV", " ", " ", " ", " "), `H021-FYR8SS` = c(" ", " ", " ", " ", " ", "insertion", "deletion", "deletion, SNV, SNV, SNV", " "), row.names = c("RP1", "NCOA2", "RGS22", "CSMD3", "TNFRSF11B", "SEMA3A", "ENPP2", "IGLV3-1", "MTMR11"), stringsAsFactors = FALSE )
期望输出示例
H021-2YTE1K H021-4YZREF H021-FYR8SS RP1 " " "SNV" " " NCOA2 " " "SNV" " " RGS22 " " "SNV" " " CSMD3 " " "SNV" " " TNFRSF11B " " "SNV" " " SEMA3A " " " " "insertion" ENPP2 " " " " "deletion" IGLV3-1 " " " " "deletion; SNV" MTMR11 "SNV" " " " "
解决方案1:Base R 批量处理
用apply()遍历所有列,对每一列复用你已经写好的处理逻辑:
library(stringr) # 对整个DataFrame应用去重逻辑 data_cleaned <- apply(data, 2, function(col) { sapply(col, function(x) { paste(unique(unlist(str_split(x, ", "))), collapse = "; ") }) }) # 转换回DataFrame并保留原行名 data_cleaned <- as.data.frame(data_cleaned, stringsAsFactors = FALSE) row.names(data_cleaned) <- row.names(data)
解决方案2:tidyverse 简洁实现
如果习惯用dplyr,可以用mutate(across())批量处理所有列:
library(dplyr) library(stringr) data_cleaned <- data %>% mutate(across(everything(), ~ { paste(unique(unlist(str_split(.x, ", "))), collapse = "; ") }))
注意事项
如果你的DataFrame包含非字符类型的列,建议只处理字符型列,避免报错:
data_cleaned <- data %>% mutate(across(where(is.character), ~ { paste(unique(unlist(str_split(.x, ", "))), collapse = "; ") }))
内容的提问来源于stack exchange,提问作者noobie
相关产品推荐
相关产品推荐

