替换向量的特定元素

时间:2014-01-30 14:33:52

标签: r

我正在尝试使用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

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

您必须仔细跟踪功能流程,评估值是什么。您希望基于14替换为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
 sapply(c(3,2,2,3,1,3,5,6,4), function(x) table[which(table[,1] == x),2] )

也为您提供所需的输出