【问题标题】:How do I generate new vectors based on the results of ifelse statements in r?如何根据 r 中 ifelse 语句的结果生成新向量?
【发布时间】:2016-06-27 09:25:01
【问题描述】:

我正在尝试根据现有变量的值生成两个新变量。这是一个非常简单的操作,但我似乎无法让它在 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

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

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

但我知道那是不正确的。

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

【问题讨论】:

  • 为什么不一次做两个:ifelse(Condition==1 | Condition==3, 0, 1) 假设只有 4 个可能的值。
  • ifelse 函数采用以下三个值:condition, yes, no。但是,您的代码具有以下内容:condition, yes, no, ifelse...。将no 替换为下一个ifelse 即可。

标签: r


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多