问题 R的ifelse如何处理字符数据?


代码片段:

blarg = data.frame(a=c("aa", "bb", "dd"))
blarg$b = blarg$a
# blarg$b is now c("aa", "bb", "dd")
blarg$b = ifelse(blarg$a!="bb",blarg$a,"ZZZ")
# blarg$b is now c(1, "ZZZ", 3)
# I expected c("aa", "ZZZ", "dd")
# typeof(blarg$b) is "character"

为什么blarg $ b c(1,“ZZZ”,3)?这些数字来自哪里?


3376
2018-05-25 21:39


起源

R做了 blarg$a 成为一个因素。你可以试试 stringsAsFactors=FALSE - Ben Bolker
我不介意它是一个因素。如何从ifelse中获得相同的因素? - dfrankow
你可以施展 blarg$a 性格: ifelse(blarg$a!="bb",as.character(blarg$a),"ZZZ") 给 c("aa", "ZZZ", "dd") - Brian Diggs
这样可行。提交它作为答案,我会接受它。我觉得R很困惑。 - dfrankow
quantumforest.com/2011/12/r-pitfall-3-friggin-factors , burns-stat.com/pages/Tutor/R_inferno.pdf , rwiki.sciviews.org/doku.php?id=tips:data-factors:factors , scs.math.yorku.ca/index.php/R/Traps_and_pitfalls - Ben Bolker


答案:


使用名为blarg的data.frame的+1。

为了扩展Ben所说的,因子在内部存储为整数,所以当你做这样的事情时,R不能按照你期望的方式处理它。

看一眼 str(blarg) 在上面的代码的步骤中。

你可以使用 stringsAsFactors=FALSE 正如本建议,或利用这个因素:

ifelse(blarg$a!='bb', levels(blarg$a), 'ZZZ')

或者更好的是,如果你想要更换水平 blarg$a 那是 'bb',你可以消除 ifelse 声明:

levels(blarg$a)[levels(blarg$a)=='bb'] <- 'ZZZ'

12
2018-05-25 21:55