条件错误,mutate/elseif_管道中的逻辑进程



我正试图弄清楚为什么这样的代码不能给我预期的结果。我知道有更好的方法来实现结果(切割等(,但我特别想了解为什么突变>ifelse管道进程替换值不起作用。


A <- c(1,0,0,0,NA,0,1,0,1,0,0,1,1,1,NA,NA,NA,1,0,0,0,1,1,1,0,1,NA)
B <- c(1,0,0,NA,0,1,1,1,0,1,NA,1,0,1,NA,NA,1,0,01,0,0,0,NA,0,1,0,1)
C <- c(0,NA,0,1,0,1,NA,1,0,1,NA,0,1,0,NA,NA,1,0,01,NA,0,0,NA,1,NA,NA,1)
df <- data.frame(A, B, C)
df$D <- NA
df <- df %>% 
mutate(D=ifelse(A==0 & B==0 & C==0,0,D)) %>%  #assign 0 to d IF all 3 variables 0
mutate(D=ifelse(A==0 | B==0 | C==0,0,D)) %>%  #now assign 0 to d IF ANY of 3 variables 0
mutate(D=ifelse(A==1 | B==1 | C==1,1,D))      #now reassign d to 1 if any of the variables has the value 1
> summary(as.factor(df$D))
0    1 NA's 
2   19    6 

但看看交叉表,我的目标是得到0=2和NA=2,其余分配为1。我不明白为什么我的代码的逻辑不起作用。

> ftable(xtabs(~A+B+C, df, addNA = TRUE, na.action = NULL)) #matches AV variable
C 0 1 NA
A  B          
0  0    2 0  2
1    0 4  1
NA   0 1  1
1  0    3 2  1
1    3 0  1
NA   0 0  1
NA 0    1 0  0
1    0 2  0
NA   0 0  2

编辑:更正打字错误

逐步查看您的代码,特别是具有OR条件的两个mutate命令。对于包含缺失和1(但没有零(的行,R无法检查此行是否包含零,因为它不知道NA可能是什么。因此,第二个突变为任何只有1和NA的行返回NA。第三步Windows相同,只是用1。任何只包含0和NA的行都将返回NA。

您可以通过以下方式进行验证:

x <- c(0, 0, NA)
any(x == 0)
[1] TRUE
any(x == 1)
[1] NA

你可以做:

library(tidyverse)
df2 <- df %>%
mutate(D = case_when(A == 0 & B == 0 & C == 0 ~ 0,
is.na(A) & is.na(B) & is.na(C) ~ NA_real_,
TRUE ~ 1))

它给出:

A  B  C  D
1   1  1  0  1
2   0  0 NA  1
3   0  0  0  0
4   0 NA  1  1
5  NA  0  0  1
6   0  1  1  1
7   1  1 NA  1
8   0  1  1  1
9   1  0  0  1
10  0  1  1  1
11  0 NA NA  1
12  1  1  0  1
13  1  0  1  1
14  1  1  0  1
15 NA NA NA NA
16 NA NA NA NA
17 NA  1  1  1
18  1  0  0  1
19  0  1  1  1
20  0  0 NA  1
21  0  0  0  0
22  1  0  0  1
23  1 NA NA  1
24  1  0  1  1
25  0  1 NA  1
26  1  0 NA  1
27 NA  1  1  1

然后

df2 %>% count(D)
D  n
1  0  2
2  1 23
3 NA  2

最新更新