我想知道是否允许在car包的recode函数的recodes参数中使用等号(=)?
例如,以下代码会失败:
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 如果我在将recodes参数作为用户输入的上下文中使用recode,我希望任何解决方案都不需要显式转义字符,因为这会很麻烦。
我运行的是R版本3.2.3 (2015-12-10) --“木质圣诞树”
发布于 2016-04-21 03:58:25
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))
}如果新/旧代码以某种病态的方式重叠,这可能会变得有点丑陋……
发布于 2016-04-21 05:27:33
假设我在将recodes参数作为用户输入的上下文中使用recode,则为
我不确定这是什么意思,但这是相当终端用户友好的:
map_em = function(
n,
recs = readline(prompt = "enter map like key = value, key2 = value2: \n")
){
m = eval(parse(text = sprintf("list(%s)", recs)))
s = stack(m)
s$ind[ match(n, s$value) ]
}
# usage example
map_em(n)
# enter map like key = value, key2 = value2:
'<= 20' = 0:20, '> 20' = 21:70
# [1] <= 20 <= 20 <= 20 > 20 > 20 > 20
# Levels: <= 20 > 20因为它使用match,所以您的用户可以输入重叠的值(就像OP did一样,编写0:20和20:70),并且它将只接受第一个匹配值。
类似地,用户可以在函数调用中直接传递映射:
map_em2 = function(n, ...){
m = list(...)
s = stack(m)
s$ind[ match(n, s$value) ]
}
# usage example
map_em2(n, '<= 20' = 0:20, '> 20' = 21:70)
# [1] <= 20 <= 20 <= 20 > 20 > 20 > 20
# Levels: <= 20 > 20发布于 2016-04-05 06:20:56
我也有同样的问题,但没有找到任何解决方案。这是我笨拙的解决方案,使用gsub
r <- recode(n, " 0:20 = '< 20' ; 20:70 = '> 20' ")
r <- gsub("< 20", "<= 20", r)https://stackoverflow.com/questions/36403341
复制相似问题