在R语言中拆分字符串为六个变量时遇问题,请求协助排查
问题排查与解决方案
嘿,我来帮你搞定这个拆分出问题的事儿!你用colsplit的时候结果异常,核心原因是参数传错了,还有个小细节没注意到,咱们一步步说:
错误根源
reshape2::colsplit()的第一个参数要求是单一的字符向量,但你直接把整个statusTemp数据框传进去了——它虽然只有一列,但本质还是数据框,不是字符向量。函数会把整个数据框转换成一个超长的字符串(就是你看到的那个c(...)开头的截断内容),自然只能拆出第一列,剩下的列没有对应数据就变成NA了。
另外还有个小坑:你的Status列里的分隔符是; (分号加空格),如果只写;当分隔符,拆分出来的每个值会带前导空格,后续转数值的时候可能出问题,最好把分隔符设置成匹配分号和后面的任意空格。
修正后的操作方法
方法1:修正reshape2的colsplit用法
只需要传入statusTemp$Status这个字符向量就行,再处理下分隔符和类型转换:
library(reshape2) # 传入正确的字符向量,用";\\s*"匹配分号+任意空格 statusTemp_split <- colsplit(statusTemp$Status, ";\\s*", names = c("Application", "Screening", "Test", "Interview", "References", "Hired")) # 把拆分后的字符列转成数值型 statusTemp_split <- lapply(statusTemp_split, as.numeric) %>% as.data.frame()
方法2:用更现代的tidyr::separate(推荐)
现在tidyr的separate函数更贴合数据框操作的逻辑,还能自动转类型,配合dplyr的管道语法更顺手:
library(dplyr) library(tidyr) statusTemp_split <- statusTemp %>% separate(Status, into = c("Application", "Screening", "Test", "Interview", "References", "Hired"), sep = ";\\s*", # 匹配分号及后面的空格 convert = TRUE) # 自动把拆分结果转成合适的类型(这里就是数值型)
验证结果
运行完上面的代码后,用tail(statusTemp_split, 15)就能看到拆分后的正确数据,每个变量对应原来的数值,没有NA,也不会有多余的空格。
内容的提问来源于stack exchange,提问作者Nordsted
相关产品推荐
相关产品推荐

