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

R语言人口数据单位转换代码优化:寻求更高效实现方案

优化带单位人口数值转换的R代码

你的原始循环代码能实现需求,但R是向量化语言,用向量化操作替代循环会更简洁高效,以下是几种优化方案:

方案1:使用tidyverse工具链(dplyr + stringr)

利用case_when实现向量化条件判断,搭配str_remove简化字符串处理:

library(dplyr)
library(stringr)

df <- data.frame(Population = c("4.88M", "3.12M", "819k",  "4660",  "46.7k", "4.86M", "856k"))

df <- df %>%
  mutate(
    pop_fix = case_when(
      str_detect(Population, "k") ~ as.numeric(str_remove(Population, "k")) * 1000,
      str_detect(Population, "M") ~ as.numeric(str_remove(Population, "M")) * 1e6,
      TRUE ~ as.numeric(Population)
    )
  )

方案2:纯Base R实现(无额外依赖)

通过统一提取数字、匹配单位生成乘数的方式,完全向量化处理:

df <- data.frame(Population = c("4.88M", "3.12M", "819k",  "4660",  "46.7k", "4.86M", "856k"))

# 提取所有数字部分(去掉k/M)
num_values <- as.numeric(gsub("[kM]", "", df$Population))
# 根据单位生成对应乘数
multipliers <- ifelse(grepl("k", df$Population), 1000,
                      ifelse(grepl("M", df$Population), 1000000, 1))
# 计算最终数值
df$pop_fix <- num_values * multipliers

方案3:用gsubfn简化单位替换计算

gsubfn包允许直接将单位替换为对应的乘法表达式,再转为数值计算:

library(gsubfn)

df <- data.frame(Population = c("4.88M", "3.12M", "819k",  "4660",  "46.7k", "4.86M", "856k"))

df$pop_fix <- sapply(df$Population, function(x) {
  as.numeric(gsubfn("[kM]", list(k="*1000", M="*1000000"), x))
})

关于你之前ifelse报错的说明

之前用ifelse出错大概率是因为没有做整体向量化处理,比如直接在单条ifelse里嵌套字符串操作时,没有确保每个分支都返回长度匹配的向量,上面的方案都严格遵循向量化逻辑,不会出现值覆盖的问题。

内容的提问来源于stack exchange,提问作者Isuckatthis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:37:14