【问题标题】:ifelse statement for more than two conditions两个以上条件的 ifelse 语句
【发布时间】:2014-10-09 04:43:02
【问题描述】:

我知道有很多关于ifelse的问题,但我搜索并尝试了很多但没有成功,因此我在这里发布问题。

我有一个包含 10k 个参与者的数据框,其中包含 8 个变量,每个变量编码为 0、1、9 和 NA。我想创建一个变量来总结所有 8 个变量。

我要创建的条件是:如果 8 个变量中有一个值为 1,则新变量应为 1,如果有一个为 9,则返回 9,否则(行中的所有变量均为 NA 或其他)返回 0 .

我创建的代码是这样的,但只得到 1 和 NA:

z = with(dt, ifelse(var.1==1|var.2==1|var.3==1|var.4==1|
var.5==1|var.6==1|var.7==1|var.8==1, 1, ifelse(var.1==9|var.2==9|var.3==9|var.4==9|
var.5==9|var.6==9|var.7==9|var.8==9, 9, 0)))

谢谢。

【问题讨论】:

  • 您的代码看起来不错。这是什么意思“我创建的代码是这个,但只得到 1 和 NA”。你能分享你的预期输出吗?此外,即使是几行的可重现示例也确实会有所帮助。
  • 输出只有 1 和 NA,但是当我只使用前 3 或 4 个变量时,它工作正常。
  • 逻辑条件x==1返回TRUE如果x=1,FALSE如果x!=1,但是NA如果x=NA。
  • 当最后一个变量 (var.8) 为 NA 时,它返回 NA 或 1(不是 0 或 9)。 @jlhoward 你是什么意思?
  • 你可能想看看%in%

标签: r if-statement


【解决方案1】:

试试这个(没有数据示例的未经测试的代码):

 ifelse( rowSums(dt[ , c("var.1","var.2", "var.3", "var.4", "var.5", "var.6", "var.7", 
                         "var.8")]==1, na.rm=TRUE), 1, 
       ifelse(  rowSums(dt[ , c("var.1","var.2", "var.3", "var.4", "var.5", 
                                 "var.6", "var.7", "var.8")]==9, na.rm=TRUE) , 
                 9, 0))

ifelse 调用将值 0 隐式强制转换为 false,并且除 0 之外的任何值都是 TRUE。 na.rm=TRUE 使总和不为 NA。如果一行中的所有值都是 NA,我想你可能会遇到问题。

【讨论】:

  • 谢谢您,此代码有效!有趣的是你如何使用 rowSum 但仍然得到 1 或 9 而不是总和......希望你明白我的意思。
  • ifelse 将整数和强制为 TRUE 或 FALSE。
猜你喜欢
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多