我正在尝试使用R
创建一个用户定义的函数wrkexpcode.into.month <- function(vec) {
tmp.vec <- vec
tmp.vec[tmp.vec == 0 | tmp.vec == 9] <- NA
tmp.vec[tmp.vec == 1] <- 4
tmp.vec[tmp.vec == 2] <- 13
tmp.vec[tmp.vec == 3] <- 31
tmp.vec[tmp.vec == 4] <- 78
tmp.vec[tmp.vec == 5] <- 174
tmp.vec[tmp.vec == 6] <- 240
return (tmp.vec)
}
但是当我使用像
这样的简单命令执行时wrkexpcode.into.month(c(3,2,2,3,1,3,5,6,4))
结果就像
[1] 31 13 13 31 78 31 174 240 78
但我希望结果如
[1] 31 13 13 31 **4** 31 174 240 78
我该如何解决这个问题?
答案 0 :(得分:3)
您必须仔细跟踪功能流程,评估值是什么。您希望基于1
将4
替换为tmp.vec[tmp.vec == 1] <- 4
,但在tmp.vec[tmp.vec == 4] <- 78
之后的4
中,78
将替换为tmp.vec
}}。这是因为替换tmp.vec
中的值并使用vec
来确定需要替换的内容。就像@MattewPlourde所说的那样,你需要以tmp.vec[vec == 1] <- 4
:
wrkexpcode.into.month <- function(vec) {
translation_vector = c('0' = NA, '1' = 4, '2' = 13, '3' = 31,
'4' = 78, '5' = 174, '6' = 240, '9' = NA)
return(translation_vector[as.character(vec)])
}
wrkexpcode.into.month(c(3,2,2,3,1,3,5,6,4))
# 3 2 2 3 1 3 5 6 4
# 31 13 13 31 4 31 174 240 78
虽然我只想用以下代码替换代码:
{{1}}
另请参阅有关此类操作的博文I wrote recently。
答案 1 :(得分:2)
它认为使用为此目的而设计的许多recode
函数之一而不是硬编码会更容易。那只是一个单行,例如
library(likert)
x <- c(3,2,2,3,1,3,5,6,4)
recode(x, from=c(0:6, 9), to=c(NA, 4,13,31,78,174,240,NA))
[1] 31 13 13 31 4 31 174 240 78
如果需要,将其包装成一个函数,例如
wrkexpcode.into.month <- function(x)
recode(x, from=c(0:6, 9), to=c(NA, 4,13,31,78,174,240,NA))
wrkexpcode.into.month(x)
[1] 31 13 13 31 4 31 174 240 78
答案 2 :(得分:0)
您可以创建矩阵,将输入值(column1)指向所需的输出值(column2)
table=matrix(c(0,1,2,3,4,5,6,9,NA,4,13,31,78,174,240,NA),ncol=2)
在矢量c(3,2,2,3,1,3,5,6,4)
sapply(c(3,2,2,3,1,3,5,6,4), function(x) table[which(table[,1] == x),2] )
也为您提供所需的输出