重新编码ifelse或声明

时间:2017-02-10 01:41:10

标签: r if-statement recode

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

如果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))

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您至少需要n-1条ifelse()语句才能获得n个唯一结果。

为简化问题,请使用|)对每个结果的标准进行分组。
就你而言 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)  

0testA == 0 & testB == 0

NAis.na(testA) & 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")))