【问题标题】:recode ifelse or statement重新编码 ifelse 或语句
【发布时间】:2017-02-10 01:41:10
【问题描述】:

我正在尝试生成一个新变量,如下所示:

如果 testA 的值为 1,而 testB 的值为 1 ==> 将 testAB 编码为 1

如果 testA 的值为 1 而 testB 的值缺失或 0 ==> 将 testAB 编码为 1

如果 testA 的值缺失或为 0,而 testB 的值为 1 ==> 将 testAB 编码为 1

如果 testA 的值为 0 且 testB 的值为 0 ==> 将 testAB 编码为 0

如果缺少 testA 的值并且缺少 testB 的值 ==> 将 testAB 编码为 NA

我想出的代码如下所示不起作用。如果 testA 和 testB 为 1,似乎只生成 1,否则生成 NA。你有什么建议吗?谢谢!

df2$testAB<-ifelse((df1$testA == 1) | (df1$testB == 1),1,0),1, 0,NA))

【问题讨论】:

  • 或许as.numeric(as.logical(df1$testA) | as.logical(df1$testB))

标签: r if-statement recode


【解决方案1】:

这应该可以为您提供所需的内容

df1 <- data.frame(testA = c(1, 1, 1, 0, 0, 0, NA, NA, NA),
                  testB = c(0, 1, NA, 0, 1, NA, 0, 1, NA))

ind <- is.na(df1$testA) + is.na(df1$testB) < 2
df1$testAB[!ind] <- NA
df1$testAB[ind] <- as.numeric(as.logical(rowSums(df1[ind,], na.rm = TRUE)))

> df1
  testA testB testAB
1     1     0      1
2     1     1      1
3     1    NA      1
4     0     0      0
5     0     1      1
6     0    NA      0
7    NA     0      0
8    NA     1      1
9    NA    NA     NA

【讨论】:

  • 不幸的是,这似乎不起作用,因为它忽略了第一个 0。基本上我想要一个 or 命令来执行此操作: if testA == 1 | testB == 1 然后 testAB == 1. 否则 testAB== 0. 如果 testA 和 testB == NA,则 testAB == NA
  • @Victoria 答案已更新,以说明值为 0NA 时的情况
【解决方案2】:

对于 n 个独特的结果,您至少需要 n-1 个 ifelse() 语句。

为简化问题,请将每个结果的标准分组为 (|)。
在你的情况下.. 1:

(df$testA == 1 & df$testB == 1) |  
(df$testA == 1 & (is.na(df$testB) | df$testB == 0)) |
((is.na(df$testA) | df$testA == 0) & df$testB == 1)  

0:testA == 0 &amp; testB == 0

NA:is.na(testA) &amp; is.na(testB)

使用n-1个语句你不必写最昂贵的语句,所以下面的逻辑是:定义所有的NA,然后都是0,剩下的就是1。

df <- expand.grid(testA =c(NA,0,1),testB = c(NA,0,1))

df$testAB = ifelse(is.na(df$testA) & is.na(df$testB),NA,
              ifelse(df$testA == 0 & df$testB == 0, 0,1)) 

结果:

  testA testB testAB
1    NA    NA     NA
2     0    NA     NA
3     1    NA      1
4    NA     0     NA
5     0     0      0
6     1     0      1
7    NA     1      1
8     0     1      1
9     1     1      1

Tidyverse 版本:

library(tidyverse)

df <- expand.grid(testA =c(NA,0,1),testB = c(NA,0,1))

df <- df %>% 
  mutate(testAB = ifelse(is.na(testA) & is.na(testB),NA,
                         ifelse(testA == 0 & testB == 0, 0,1))
        )

要测试您自己的逻辑,您可以明确所有参数:

df$testAB = ifelse(is.na(df$testA) & is.na(df$testB),NA,
              ifelse(df$testA == 0 & df$testB == 0, 0,
                     ifelse((df$testA == 1 & df$testB == 1) |
                            (df$testA == 1 & (is.na(df$testB) | df$testB == 0)) |
                            ((is.na(df$testA) | df$testA == 0) & df$testB == 1),1,
                            "error")))

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多