R语言如何为数据框字符型列的不同取值分配指定数值
错误原因
你写的ifelse代码存在两个核心问题,导致无法得到正确结果:
ifelse()的语法要求第一个参数必须返回逻辑值(TRUE/FALSE),你直接把Style列的字符内容传入,R只会把所有非空字符串判定为TRUE,同时你把要匹配的目标值"Hallo"放到了第二个参数(也就是条件为真时的返回值位置),参数位置完全错位- 你仅写了Hallo对应1的规则,剩余4种字符值的映射逻辑完全缺失,自然无法生成正确的整列结果。另外你给数值1加了引号,就算逻辑写对,生成的新列也会是字符型而非数值型。
正确实现方案
方案1:使用dplyr::recode()(最推荐)
这是多固定值映射场景下可读性最高的写法,直接按照"原字符" = 对应数值的格式写全映射规则即可:
library(dplyr) Data <- Data %>% mutate( Style_Numeric = recode( Style, "Hallo" = 1, "Hello" = 2, "Bonjour" = 3, "Bye" = 4, "Au Revoir" = 5 ) )
运行后得到的结果完全符合要求:
Name Style Style_Numeric 1 A Hello 2 2 B Bonjour 3 3 C Hallo 1 4 D Bye 4 5 E Au Revoir 5
方案2:命名向量匹配(适合映射规则较多的场景)
如果你的映射值很多,可以先把规则存为命名向量,后续维护规则只需要修改这个向量即可,不用改mutate里的逻辑:
# 预先定义映射规则 style_match <- c( "Hallo" = 1, "Hello" = 2, "Bonjour" = 3, "Bye" = 4, "Au Revoir" = 5 ) Data <- Data %>% mutate(Style_Numeric = unname(style_match[Style]))
方案3:嵌套ifelse(不推荐,仅作语法参考)
如果一定要用ifelse实现,需要写全判断逻辑,多层嵌套,规则多了之后代码很难维护:
Data <- Data %>% mutate( Style_Numeric = ifelse(Style == "Hallo", 1, ifelse(Style == "Hello", 2, ifelse(Style == "Bonjour", 3, ifelse(Style == "Bye", 4, 5) ) ) ) )
提示:如果后续Style列出现了你没定义映射规则的新值,
recode()会直接报错提示,避免你漏写规则生成错误的NA值,这也是优先推荐用recode的原因之一。
内容的提问来源于stack exchange,提问作者remo
相关产品推荐
相关产品推荐

