R语言如何将dataframe中带列名前缀的错位值移动到对应正确列
R语言批量修复带列标识的错位数据框
核心思路
不用复杂操作,全用基础R函数就能实现,逻辑非常直白:
- 先整理一份「前缀-目标列名」的映射表:所有错位值前面的
xxx:标识就是前缀,对应到你数据框里的正确列名。因为你的数据一共45列,扫一遍所有带冒号的错位值,10分钟就能把映射表补全。 - 逐行逐单元格读取内容:如果内容匹配到已知前缀,就删掉前缀,把后面的有效值放到对应的目标列;如果没匹配到前缀,说明这个值本来就在正确位置,直接保留。
- 最后统一清理多余的空格、换行符,空值留空或者转成NA即可。
示例代码(先跑通小测试数据)
先拿你给的3行小示例做测试,复制直接跑就能得到你要的规整结果:
# 1. 构造示例测试数据 Country <- c("Spain", "Time:16 Mar 2018 - 23 Apr 2018", "USA") Platform <- c("Twitter", "Country:Germany", "Cap:200") Start_Time <- c("10 Jun 2018 - 2 Jul 2018", "Platform:Facebook", "Platform:Instagram") Cap <- c("300", "500", "Time:10 Jun 2018 - 2 Jul 2018") dat <- data.frame(Country, Platform, Start_Time, Cap, stringsAsFactors = FALSE) # 2. 配置前缀和目标列的映射关系 prefix_map <- c( "Country:" = "Country", "Platform:" = "Platform", "Time:" = "Start_Time", "Cap:" = "Cap" ) # 3. 初始化空的结果表,结构和原表完全一致 res <- as.data.frame( matrix("", nrow = nrow(dat), ncol = ncol(dat)), stringsAsFactors = FALSE ) colnames(res) <- colnames(dat) # 4. 逐行逐单元格清洗 for (i in seq_len(nrow(dat))) { for (j in seq_len(ncol(dat))) { # 读取原始值,去掉换行、前后多余空格 raw_val <- trimws(gsub("[\n\r]", "", as.character(dat[i, j]))) if (raw_val == "") next # 匹配前缀 hit_idx <- which(startsWith(raw_val, names(prefix_map))) if (length(hit_idx) > 0) { # 匹配到前缀:是错位值,放到对应目标列 hit_prefix <- names(prefix_map)[hit_idx[1]] target_col <- which(colnames(res) == prefix_map[hit_prefix]) clean_val <- trimws(substr(raw_val, nchar(hit_prefix) + 1, nchar(raw_val))) res[i, target_col] <- clean_val } else { # 没匹配到前缀:是当前列的正常值,直接保留 res[i, j] <- raw_val } } } # 查看处理结果 print(res)
跑出来的结果和你预期的完全一致:
Country Platform Start_Time Cap 1 Spain Twitter 10 Jun 2018 - 2 Jul 2018 300 2 Germany Facebook 16 Mar 2018 - 23 Apr 2018 500 3 USA Instagram 10 Jun 2018 - 2 Jul 2018 200
适配你的真实729行数据
你贴的前6行dput数据里,前缀和列名有小的格式差异(比如列名用下划线分隔,前缀用空格/斜杠分隔),只要把映射表补全就行,示例映射如下,你把剩下的列按格式补全即可:
# 真实数据的前缀映射,补全所有前缀即可 prefix_map <- c( "ICO Time:" = "ICO_Time", "Presale Time:" = "Presale_Time", "Whitelist/KYC:" = "Whitelist_KYC", "Country:" = "Country", "Platform:" = "Platform", "Token Type:" = "Token_Type", "Total supply:" = "Total_Supply_2", "Accepting:" = "Accepting", "Soft cap:" = "Soft_Cap", "Hard cap:" = "Hard_Cap", "Bonuses:" = "Bonus" # 剩余的前缀你扫一遍数据里所有带:的值,按上面的格式加进去就行 )
注意事项
- 全程用基础R函数,不需要安装任何第三方包,新手直接复制就能运行。
- 如果遇到短前缀和长前缀冲突(比如同时有
Cap:和Soft cap:),把长的前缀写在映射表前面,匹配的时候优先取长前缀,避免误判。 - 第一次跑完如果发现有漏网的错位值,只要把对应的前缀补到映射表里重新跑一遍即可,700多行数据处理时间不到1秒,比手动改效率高几十倍。
- 处理完可以把空字符串统一替换成
NA,方便后续分析:res[res == ""] <- NA。
内容的提问来源于stack exchange,提问作者Soph2010
相关产品推荐
相关产品推荐

