我正在尝试生成一个新变量,如下所示:
如果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))
答案 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)
0
:testA == 0 & testB == 0
NA
:is.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")))