R:ifelse的麻烦
对于同一个对象,我有两种度量。度量值为二进制(1,0),但也缺少许多观测值,因此可能的选项为:1,0,NA 数据包括: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。否则,如果其中一个源未丢失
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")