如何批量将含百分号、逗号小数点的字符列转为数值类型
批量转换百分比列为数值类型的方法
你可以用dplyr的批量处理函数一次性转换所有百分比列,以下是几种实用方案:
方案一:按列名匹配(推荐,简洁高效)
利用列名包含"Prozent"的特征,结合across(dplyr 1.0.0及以上版本推荐)批量处理:
library(tidyverse) # 你的原始数据 data <- data.frame( stringsAsFactors = FALSE, check.names = FALSE, row.names = c("2", "3", "4", "5", "6", "7"), Year = c("1992", "1993","1994","1995","1996","1997"), gesamt = c("472", "997", "1443", "1810", "2321", "2835"), weiblich = c("236", "546", "724", "949", "1242", "1584"), `weiblich inProzent` = c("50,0%", "54,8%","50,2%","52,4%","53,5%","55,9%"), Deutsche = c("325", "598", "841", "1030", "1348", "1662"), `Deutsche inProzent` = c("68,9%", "60,0%","58,3%","56,9%","58,1%","58,6%"), `Ausländer/innengesamt` = c("169", "399", "602", "780", "973", "1173"), `Ausländer/innenin Prozent` = c("35,8%", "40,0%","41,7%","43,1%","41,9%","41,4%"), davonPolen = c("167", "384", "566", "731", "883", "1053"), `Polenin Prozent` = c("35,4%", "38,5%","39,2%","40,4%","38,0%","37,1%") ) # 批量转换:直接覆盖原百分比列 data_processed <- data %>% mutate(across(contains("Prozent"), ~ parse_number(.x, locale = locale(decimal_mark = ",")))) # 查看转换后的数据结构 glimpse(data_processed)
关键说明:
across(contains("Prozent"), ...):精准选中所有列名含"Prozent"的列parse_number(..., locale = locale(decimal_mark = ",")):因为你的数据用逗号作为小数点分隔符,必须指定locale才能正确解析(否则会把"50,0%"错误解析为500)- 若想保留原列并生成新的数值列,可修改为:
data_processed <- data %>% mutate(across(contains("Prozent"), ~ parse_number(.x, locale = locale(decimal_mark = ",")), .names = "{.col}_num"))
执行后会生成如weiblich inProzent_num的新数值列,原百分比列保留。
方案二:兼容旧版dplyr(mutate_at)
如果你使用的是dplyr 1.0.0之前的版本,可改用mutate_at实现相同逻辑:
data_processed <- data %>% mutate_at(vars(contains("Prozent")), ~ parse_number(.x, locale = locale(decimal_mark = ",")))
方案三:按列内容匹配(更灵活)
如果不想依赖列名,而是根据列内容是否包含百分号%来检测目标列,可使用以下代码:
# 先检测所有含百分号的列 percent_cols <- sapply(data, function(col) any(str_detect(col, "%"))) # 批量转换这些列 data_processed <- data %>% mutate(across(all_of(names(percent_cols)[percent_cols]), ~ parse_number(.x, locale = locale(decimal_mark = ","))))
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

