R语言重命名列时丢失列:调用Lotacao_Small后data.frame少一列
问题:调用自定义函数后DataFrame丢失一列,目标重命名列消失
我在给数据框添加列并重命名输入值后遇到了麻烦:原本有13列的Teste数据框,调用Lotacao_Small()函数后只剩12列,原本打算重命名的列直接消失了,实在找不到问题根源。
相关代码和环境信息如下:
# 加载数据源 link <- url("https://raw.githack.com/fsbmat/salarioDocente/master/Teste/Dez2018SerT.csv") Teste <- read.csv2(link, header = TRUE, encoding = "ASCII", skipNul = TRUE) # 调用自定义处理函数 source("https://raw.githack.com/fsbmat/salarioDocente/master/Teste/Lotacao_Small.R") Teste <- Lotacao_Small(Teste) # 查看环境信息 sessionInfo()
环境信息输出:
R version 3.5.2 (2018-12-20) Platform: x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8 x64 (build 9200) Matrix products: default locale: [1] LC_COLLATE=Portuguese_Brazil.1252 LC_CTYPE=Portuguese_Brazil.1252 [3] LC_MONETARY=Portuguese_Brazil.1252 LC_NUMERIC=C [5] LC_TIME=Portuguese_Brazil.1252 attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] compiler_3.5.2 plyr_1.8.4 tools_3.5.2 yaml_2.2.0 Rcpp_1.0.0
排查&解决建议
这种问题几乎肯定出在Lotacao_Small()函数的内部逻辑里,毕竟数据是在调用这个函数后才丢列的。给你几个具体的排查方向:
先拆解函数代码逻辑
直接查看Lotacao_Small.R的代码,重点盯这几个点:- 有没有用
[, c(...)]这种列筛选操作,但漏写了目标列 - 重命名步骤是不是用了
names()直接替换所有列名,但新列名数量和原列数不匹配 - 有没有用
dplyr::select()或类似函数,不小心把要保留的列排除了
- 有没有用
分步验证数据变化
在调用函数前后分别检查列的情况,精准定位丢失的列:# 调用前检查基础信息 cat("调用前列数:", ncol(Teste), "\n") cat("调用前列名:", paste(names(Teste), collapse = ", "), "\n") # 调用函数但不覆盖原数据 Teste_after <- Lotacao_Small(Teste) # 调用后对比 cat("调用后列数:", ncol(Teste_after), "\n") cat("调用后列名:", paste(names(Teste_after), collapse = ", "), "\n") # 找出具体丢失的列 cat("丢失的列:", setdiff(names(Teste), names(Teste_after)), "\n")知道了哪列丢了,再去函数里找对应列的处理代码就能快速定位问题。
检查重命名操作的正确性
如果丢失的就是你要重命名的列,看看函数里是不是用了这种错误写法:# 错误示例:直接替换所有列名,若数量不匹配会丢列 names(df) <- c("新列名1", "新列名2")正确的做法应该是只针对目标列重命名:
# 方法1:精准定位列替换 names(df)[names(df) == "旧列名"] <- "新列名" # 方法2:用plyr包的rename函数(你环境里已经加载了plyr) df <- plyr::rename(df, c("旧列名" = "新列名"))检查添加列的逻辑
如果是添加列后反而丢了列,看看是不是在添加列时用了这种会筛选列的操作:# 错误示例:创建新数据框时只选了部分列 df <- data.frame(df$col1, df$col2, new_col = ...)正确的添加列方式应该是直接赋值或用
cbind():# 方法1:直接给原数据框加列 df$new_col <- ... # 方法2:用cbind合并 df <- cbind(df, new_col = ...)
内容的提问来源于stack exchange,提问作者fsbmat
相关产品推荐
相关产品推荐

