You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量将含百分号、逗号小数点的字符列转为数值类型

批量转换百分比列为数值类型的方法

你可以用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:50:43