R语言新手宽转长格式遇阻,缺失值替换失败求助
孟加拉国汇款数据处理问题解决方案
一、宽转长(melt)语法错误修复
你的melt代码有两个关键问题:
- id.vars参数逻辑搞反:你的数据行是年份,宽转长时应该把年份列作为标识变量(id.vars),其余各国汇款列作为要转换的度量变量。你现在把所有国家列都放进id.vars,完全违背了宽转长的逻辑。
- 向量元素缺少逗号:
id.vars的列表里,"Japan"、"South_Korea"后面都没加逗号,这会直接导致R解析语法报错。
修正后的代码(假设年份列名为Year,如果实际列名不同,替换成你的列名即可):
library(reshape2) # 将年份列设为标识变量,其余列自动转为国家-汇款额的长格式 bd_remit_long <- melt(bd_remit, id.vars = "Year", variable.name = "Country", # 新增列:存储国家名称 value.name = "Remittance") # 新增列:存储对应汇款额
不确定年份列名的话,先运行colnames(bd_remit)查看所有列名,找到对应的年份列。
二、将"..."替换为NA失败的修复
你的替换代码存在几个问题:最后一行的%>%没有后续操作会报错;重复写多个mutate效率低;如果目标列是因子类型,na_if无法识别字符串"..."。
修正后的代码,用across批量处理指定列,同时解决因子类型的问题:
library(dplyr) bd_remit_clean <- bd_remit %>% # 保留年份列方便后续分析,也可以保留全部列 select(Year, Japan, Malaysia, Australia, Italy, South_Korea, Hong_Kong) %>% # 先把因子类型的列转为字符型(如果列本身是字符型,这一步不影响) mutate(across(c(Japan, Malaysia, Australia, Italy, South_Korea, Hong_Kong), ~ ifelse(is.factor(.), as.character(.), .))) %>% # 批量将"..."替换为NA mutate(across(c(Japan, Malaysia, Australia, Italy, South_Korea, Hong_Kong), ~ na_if(., "..."))) %>% # 可选:将列转为数值型,方便后续时间序列分析 mutate(across(c(Japan, Malaysia, Australia, Italy, South_Korea, Hong_Kong), ~ as.numeric(.))) # 验证替换结果 unique(bd_remit_clean$Japan)
如果替换后还是没效果,先运行dput(unique(bd_remit$Japan))查看实际的字符串内容,确认是不是和你写的"..."完全一致(比如有没有空格、全角点等特殊字符)。
内容的提问来源于stack exchange,提问作者Fardeen Kabir
相关产品推荐
相关产品推荐

