如何根据r中ifelse语句的结果生成新的向量?

时间:2016-03-11 23:55:37

标签: r

我正在尝试根据现有变量的值生成两个新变量。这是一个非常简单的操作,但我似乎无法使其正常运行并且在r中的向量的所有值上。我正试图从SPSS转换为r,但这个特定的目标似乎并没有很好地转化为r。

对于Condition的每个值,我想为一个名为“expect”的新变量生成一个值。所以(非正式地)我想要像

这样的东西
if Condition = 1, expect = 0
if Condition = 2, expect = 1
if Condition = 3, expect = 0
if Condition = 4, expect = 1

如何将其添加到代码中?如何在整个向量上运行这些链式ifelse语句?我意识到这是一个非常初学的问题,但我一直在寻找相当长的一段时间,并没有找到解决方案。我能收集到的最好的是:

expect<-ifelse(Condition == 1, 0, 1, ifelse(Condition == 2, 1, 0, ifelse(Condition == 3, 0, 1, ifelse(Condition == 4, 1, 0))))

但我知道这不正确。

如果有人可以提供帮助,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

在旧值和新值expect = map[Condition]之间创建地图,然后创建子集map = c(foo=1, bar=2); unname(map[c("foo", "foo", "bar")])。使用基于字符的映射名称{{1}}

答案 1 :(得分:0)

你可以随时玩“代码高尔夫”并使其更紧凑,但这里有一个简单的说明如何做到这一点:

Condition <- c(1,2,3,4,0,3,4,5)
expect    <- c(NA, NA, NA, NA, NA, NA, NA, NA)

for(i in 1:length(Condition)){
  if (Condition[i] == 1){expect[i] <- 0}
  if (Condition[i] == 2){expect[i] <- 1}
  if (Condition[i] == 3){expect[i] <- 0}
  if (Condition[i] == 4){expect[i] <- 1}
}

expect
[1]  0  1  0  1 NA  0  1 NA