R:ifelse的麻烦

R:ifelse的麻烦,r,if-statement,dplyr,R,If Statement,Dplyr,对于同一个对象,我有两种度量。度量值为二进制(1,0),但也缺少许多观测值,因此可能的选项为:1,0,NA 数据包括: Source1 Source2 NA NA NA 0 NA 1 0 NA 0 0 0 1 1 NA 1 0 1 1 (消息来源可能相互矛盾,暂时忽略这一点) 我想创建第三个复合变量来总结这两个变量,如果两个源中的任何一个=1,那么复合变量应该等于1。否则,如果其中一个源未丢失

对于同一个对象,我有两种度量。度量值为二进制(1,0),但也缺少许多观测值,因此可能的选项为:1,0,NA

数据包括:

Source1 Source2
NA      NA
NA      0
NA      1
0       NA
0       0
0       1
1       NA
1       0
1       1
(消息来源可能相互矛盾,暂时忽略这一点)

我想创建第三个复合变量来总结这两个变量,如果两个源中的任何一个=1,那么复合变量应该等于1。否则,如果其中一个源未丢失,则复合变量应等于零。最后,只有当两个源都丢失时,复合变量才应设置为missing

需要数据:

Source1 Source2 Composite
NA      NA      NA
NA      0       0
NA      1       1
0       NA      0
0       0       0
0       1       1
1       NA      1
1       0       1
1       1       1
我尝试了不同的方法,但仍然有相同的问题

尝试1:

df<- df %>% mutate(combined = ifelse(df$source1==1 | df$source2==1, 1, 
                              ifelse(df$source1==0 | df$source2==0, 0, NA)))

一种方法是在时使用
case\u,而不是在其他情况下使用
if
。首先检查缺失变量,然后再检查未缺失的情况似乎是最简单的:

library(tidyverse)
df %>% 
  mutate(S1Miss = is.na(Source1),
         S2Miss = is.na(Source2)) %>% 
  mutate(Composite = case_when(
         S1Miss & S2Miss ~ NA, 
         S1Miss | S2Miss ~ 0, 
         Source1 == 1 & Source2 == 1 ~ 1,
         TRUE ~ 0
         )) %>% 
  select(Source1, Source2, Composite)

注意这里我通过在调用
mutate
时首先存储变量,并使用
select
删除这些中间结果,使其“更易于阅读”。这很有趣,但我不建议这样做

source1<-c(NA, NA, NA, 0, 0, 0, 1, 1, 1)
source2<-c(NA, 0, 1, NA, 0, 1, NA, 0, 1)

df<-data.frame(source1, source2)  

df$composite<-ifelse(test = is.na(df$source1) & is.na(df$source2), yes = NA, 
       no = ifelse(test = is.na(df$source1) & !is.na(df$source2), yes = df$source2, 
                   no = ifelse(is.na(df$source2) & !is.na(df$source1), yes = df$source1,
                               no = ifelse(df$source1 > df$source2, yes = df$source1,
                                           no = df$source2))))

  source1 source2 composite
1      NA      NA        NA
2      NA       0         0
3      NA       1         1
4       0      NA         0
5       0       0         0
6       0       1         1
7       1      NA         1
8       1       0         1
9       1       1         1

source1假设
source1
Source2
列都由
0
1
NA
组成(如您所述)。您可以将其用作基本的R解决方案。也就是说,它使用
do.call()
在数据帧中的每个相关列上调用
pmax()

cols = paste0("Source", 1:2)
df$newcol = do.call(pmax, c(df[cols], na.rm = TRUE))
# equivalent to: pmax(df$Source1, df$Source2, na.rm = TRUE)

df
  Source1 Source2 Composite  newcol
1      NA      NA        NA      NA
2      NA       0         0       0
3      NA       1         1       1
4       0      NA         0       0
5       0       0         0       0
6       0       1         1       1
7       1      NA         1       1
8       1       0         1       1
9       1       1         1       1
数据

df = read.table(header = TRUE, text = "Source1 Source2 Composite
NA      NA      NA
NA      0       0
NA      1       1
0       NA      0
0       0       0
0       1       1
1       NA      1
1       0       1
1       1       1")

你能添加一个可复制的例子吗?这意味着在代码中创建数据的简化版本,以便人们可以尝试运行它。
source1<-c(NA, NA, NA, 0, 0, 0, 1, 1, 1)
source2<-c(NA, 0, 1, NA, 0, 1, NA, 0, 1)

df<-data.frame(source1, source2)  

df$composite<-ifelse(test = is.na(df$source1) & is.na(df$source2), yes = NA, 
       no = ifelse(test = is.na(df$source1) & !is.na(df$source2), yes = df$source2, 
                   no = ifelse(is.na(df$source2) & !is.na(df$source1), yes = df$source1,
                               no = ifelse(df$source1 > df$source2, yes = df$source1,
                                           no = df$source2))))

  source1 source2 composite
1      NA      NA        NA
2      NA       0         0
3      NA       1         1
4       0      NA         0
5       0       0         0
6       0       1         1
7       1      NA         1
8       1       0         1
9       1       1         1
cols = paste0("Source", 1:2)
df$newcol = do.call(pmax, c(df[cols], na.rm = TRUE))
# equivalent to: pmax(df$Source1, df$Source2, na.rm = TRUE)

df
  Source1 Source2 Composite  newcol
1      NA      NA        NA      NA
2      NA       0         0       0
3      NA       1         1       1
4       0      NA         0       0
5       0       0         0       0
6       0       1         1       1
7       1      NA         1       1
8       1       0         1       1
9       1       1         1       1
df = read.table(header = TRUE, text = "Source1 Source2 Composite
NA      NA      NA
NA      0       0
NA      1       1
0       NA      0
0       0       0
0       1       1
1       NA      1
1       0       1
1       1       1")