R语言:如何利用百分比与总数将普查收入数据转为实际人数
问题解决:R语言将百分比转换为实际人数
你的问题背景
你使用普查收入数据表,希望把第二列第4-12行的百分比数据转换为对应分组的实际人数(已知总调查人数为96447572),但尝试用mutate计算时遇到了非数值参数的错误。
原始操作与报错
读取数据的代码:
df <- read.csv("ACSST1Y2010.S2001-2022-11-11T181908.csv") view(df)
尝试的计算代码:
mutate((Individual_Income_Census_2010[4:12,2]*96447572)/100)
得到的错误信息:
Error in
mutate():
! Problem while computing..1 = (Individual_Income_Census_2010[4:12, 2] * 96447572)/100.
Caused by error inFUN():
! non-numeric argument to binary operator
Runrlang::last_error()to see where the error occurred.
执行rlang::last_error()返回:
<error/dplyr:::mutate_error>
问题根源
这个报错的核心是你要计算的第二列不是数值类型——从数据截图判断,这列应该是带%符号的字符串(比如12.5%),字符串无法直接与数字做乘法运算,因此触发了“非数值参数”的错误。
解决步骤
1. 将百分比字符串转换为数值
用readr包的parse_number()函数可以自动提取字符串中的数字部分,同时去掉%符号:
# 首次使用需安装依赖包 install.packages(c("dplyr", "readr")) library(dplyr) library(readr) # 提取第二列的数值,自动去除%符号 df <- df %>% mutate(second_col = parse_number(!!sym(colnames(df)[2]))) # colnames(df)[2]会自动获取第二列的列名,无需手动输入
2. 计算实际人数并替换指定行
如果仅需要修改第4-12行,其他行保留原数据:
total_pop <- 96447572 df <- df %>% mutate( # 对4-12行计算人数并取整,其他行保持原数值 second_col = ifelse(row_number() %in% 4:12, round((second_col * total_pop)/100), second_col) )
简化版(基础R操作)
如果不习惯使用dplyr,直接用基础R索引也能完成:
library(readr) # 将第二列转换为数值类型 df[,2] <- parse_number(df[,2]) # 计算并替换第4-12行的数值 df[4:12,2] <- round((df[4:12,2] * 96447572)/100)
注意事项
round()用于将计算结果取整为整数人数,你也可以根据需求换成floor()(向下取整)或ceiling()(向上取整)- 如果运行时提示找不到函数,先确认已加载
dplyr和readr包 - 若知道第二列的具体列名,直接替换代码中的
second_col会更清晰直观
内容的提问来源于stack exchange,提问作者DCosta
相关产品推荐
相关产品推荐

