dplyr中用parse_number与mutate提取文本数字并替换原始变量的方法
解决方案
你原来的代码因为先调用了select()剔除了范围外的列,所以只能拿到转换后的子集,把select步骤去掉,直接在mutate中限定要处理的列范围即可保留原数据集的全部内容。
dplyr 1.0.0及以上版本(推荐写法)
使用across()函数指定处理范围:
library(dplyr) library(readr) data <- data %>% mutate( across( .cols = systematic1:withdrawn, # 指定要处理的列范围 .fns = ~ if(is.character(.x)) parse_number(.x, na = c("Not sure")) else .x ) )
说明:
- 仅对
systematic1到withdrawn范围内的字符型变量执行数值提取,范围内的非字符变量、以及范围外的所有变量都会原封不动保留 parse_number会自动提取字符串开头的数字,完全符合你把「1 - Completely Disagree」转换为1的需求,同时会把「Not sure」识别为NA
旧版dplyr兼容写法
如果使用的是1.0.0以下的dplyr版本,用mutate_at实现:
data <- data %>% mutate_at( .vars = vars(systematic1:withdrawn), .funs = ~ if(is.character(.)) parse_number(., na = c("Not sure")) else . )
内容的提问来源于stack exchange,提问作者Jess A.
相关产品推荐
相关产品推荐

