如何无需辅助列修改数据框列中数值元素的值?(R语言)
解决
if_else类型不匹配的报错问题 你遇到的这个报错根源很明确:dplyr的if_else()函数对返回值的类型要求特别严格——它强制要求true和false两个分支的返回值必须是完全相同的数据类型。
看你的代码:
- 第一个分支
as.numeric(bar)/100会把可转换的字符转成数值型(double类型) - 第二个分支直接返回原
bar列的字符值
两种类型不匹配,自然就抛出了Evaluation error:falsemust be type double, not character.的错误。
下面给你几个可行的解决方案:
方案1:用基础R的ifelse()函数(宽松类型检查)
基础R的ifelse()不会强制要求分支类型完全一致,它会自动做隐式类型转换来适配,刚好能满足你不建辅助列的需求:
foo = c(1, 2, 3) bar = c(1, "AB", 3) df = data.frame(foo,bar,stringsAsFactors=FALSE) df %>% mutate(bar = ifelse(!is.na(as.numeric(bar)), as.numeric(bar)/100, bar))
运行后bar列会变成字符型,数值会被转成字符串形式保留计算结果,非数值的"AB"也能原样保留。
方案2:统一转成数值型(非数值转为NA)
如果你可以接受非数值内容变成NA,只想保留可计算的数值,那代码可以更简洁:
df %>% mutate(bar = as.numeric(bar)/100)
这样bar列会变成数值型,"AB"会被转换成NA,符合数值列的规范。
方案3:用case_when()统一返回字符型
如果想明确控制返回类型,用dplyr的case_when()也可以,只要保证所有分支返回同一类型就行,比如都转成字符:
df %>% mutate(bar = case_when( !is.na(as.numeric(bar)) ~ as.character(as.numeric(bar)/100), TRUE ~ bar ))
需要注意的是:数据框的每一列只能是单一数据类型,所以你没法让一列里同时存在数值和字符(本质上都会被统一成字符型),这是数据框的特性决定的哦。
内容的提问来源于stack exchange,提问作者ulrich
相关产品推荐
相关产品推荐

