我想知道是否允许在汽车包装中=函数的recodes参数中使用等号(recode)?

例如,以下失败:

library(car)
n <- c(0, 10, 20, 21, 60, 70)
r <- recode(n, " 0:20 = '<= 20' ; 20:70 = '> 20' ")
# Error in recode(n, " 0:20 = '<= 20' ; 20:70 = '> 20' ") :
# in recode term:  0:20 = '<= 20'
# message: Error in parse(text = strsplit(term, "=")[[1]][2]) :
#  <text>:1:2: unexpected INCOMPLETE_STRING
# 1:  '<
# ^


=删除<= 20可以正常工作:

r <- recode(n, " 0:20 = '< 20' ; 20:70 = '> 20' ")
table(r)
r
# < 20 > 20
# 3    3


鉴于我在将recode参数用作用户输入的环境中使用recodes,因此我希望任何解决方案都不需要显式转义字符,因为这样做会很麻烦。

我正在运行R版本3.2.3(2015-12-10)-“木制圣诞树”

最佳答案

car::recode总是会很痛苦,因为它解析recode字符串(如果它在任何地方包含“虚假”等号,该字符串都会中断)。

对于您的特定应用程序,cut效果很好:

n <- c(0, 10, 20, 21, 60, 70)
cut(n,breaks=c(-1,20,Inf),labels=c("<= 20", ">20"))


plyr::revalue对于一对一映射很有用(另请参见plyr::mapvalues):

x <- factor(c("a","b","c"))
revalue(x,c("a"=">= 20"))


我不知道一个好的现成的多对一解决方案:

x <- factor(letters[1:8])
oldvals <- list(c("a","b","c"),c("d","e"),c("f","g","h"))
newvals <- c("new1","new2","new3")
for (i in seq_along(oldvals)) {
    m <- which(levels(x) %in% oldvals[[i]])
    if (length(m)>0)
       levels(x)[m] <- rep(newvals[i],length(m))
}


如果新的/旧的代码以某种病理方式重叠,这可能会有点难看...

10-04 18:01