解析R语言legacy_repair函数功能及setdiff作用
R语言
legacy_repair函数解析与疑问解答 legacy_repair <- function(nms, prefix = "X", sep = "__") { if (length(nms) == 0) return(character()) # Returns a blank character variable? blank <- nms == "" # What does this do? Put quotations "" around the column name? nms[!blank] <- make.unique(nms[!blank], sep = sep) new_nms <- setdiff(paste(prefix, seq_along(nms), sep = sep), nms) nms[blank] <- new_nms[seq_len(sum(blank))] nms } file_names <- list.files("Data", pattern = "*.xlsx", full.names = TRUE) # This I understand DF_list <- lapply(file_names, function(x) read_xlsx(x, .name_repair = legacy_repair))
疑问解答
1. 关于return(character())的触发条件
你的理解有误。legacy_repair的参数nms接收的是Excel文件的列名向量,不是Data文件夹里的文件名。只有当传入的列名向量长度为0时(比如某个Excel文件完全没有列标题),函数才会返回空字符向量character(),和文件夹中的文件名是否空白完全无关。
2. 关于make.unique()的作用
你的理解是正确的。make.unique(nms[!blank], sep = sep)会对所有非空白的列名进行去重处理:如果有重复的列名,会在重复名称的末尾追加sep(这里是__)和数字后缀,比如重复的列名score会被处理为score、score__1、score__2,确保非空白列名都是唯一的。
3. 关于setdiff()的具体作用
这一步是为空白列生成不与现有列名重复的候选名称,拆解来看:
paste(prefix, seq_along(nms), sep = sep)会生成一批格式为X__1、X__2、X__3...的候选名称,数量和原列名总数一致。setdiff(..., nms)会从这批候选名称里剔除掉已经存在于当前处理后的列名(也就是经过make.unique去重后的非空白列名)的那些,剩下的都是完全唯一的新名称。- 最后用这些唯一的新名称替换原列名中的空白项,保证最终所有列名都是唯一且无冲突的。
内容的提问来源于stack exchange,提问作者codemachine
相关产品推荐
相关产品推荐

