将tibble中的一列拆分为多列以完成数据清洗
拆分合并变量列为多列的解决方案
针对你提供的非整洁数据,我们可以用tidyverse里的separate()函数结合正则表达式,精准拆分variable列中的section、题号、子题号和问题内容。
具体代码实现
library(tidyverse) tbl <- tibble( variable = c("a01_name", "a02_address", "a3_phone_number", "b1a_total_income", "b01b_no_of_cars") ) # 拆分列并处理格式 result_tbl <- tbl %>% separate(variable, into = c("section", "question_no", "sub_question_no", "question"), sep = "^([ab])(\\d+)([a-z]?)_", remove = TRUE, fill = "right") %>% mutate( # 把题号转为整数,自动去除前导零 question_no = as.integer(question_no), # 把子题号为空的替换成NA sub_question_no = ifelse(sub_question_no == "", NA, sub_question_no) ) # 查看结果 result_tbl
代码说明
- 正则表达式
^([ab])(\\d+)([a-z]?)_的匹配逻辑:^([ab]):抓取开头的单个字母a/b,对应section列(\\d+):抓取紧随其后的1位或多位数字,对应题号([a-z]?):抓取可选的单个小写字母(没有子题号则为空),对应子题号列_:匹配分隔用的下划线,作为拆分标记
fill = "right":确保没有子题号的行自动填充空值,后续统一转为NA- 最后用
mutate()调整数据类型和空值格式,让结果完全符合预期
运行后得到的result_tbl和你给出的desired_tbl完全一致。
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

