通过比较 R 中的两个变量来标记每条记录

Flag each record by comparing two variables in R

如何创建一个新的二进制变量来比较现有数据框中的其他两个二进制变量?

对于数据框"dframe":

    ID       FlagA  FlagB
1   28602363    1    0
2   28605734    0    1
3   28608629    1    0
4   28611734    1    0
5   28619822    NA   0
6   28622689    1    1
7   28650295    NA   1
8   28650378    0    1
9   28651602    1    1
10  28656060    1    0

我尝试创建列 "FlagAB",如果 FlagA=1 和 FlagB=0,则为 1,对于任何其他组合为 0,如下所示:

    ID          FlagA   FlagB   FlagAB
1   28602363    1       0       1
2   28605734    0       1       0
3   28608629    1       0       1
4   28611734.71 1       0       1
5   28619822    NA      0       0
6   28622689.71 1       1       0
7   28650295    NA      1       0
8   28650378    0       1       0
9   28651602    1       1       0
10  28656060    1       0       0

我尝试了以下几种变体,但没有成功。这个用“0”

填充 FlagAB 的所有行
dframe$FlagAB <- ifelse((dframe$FlagA=="1")&(dframe$FlagB=="0"),1,0)
df$FlagAB <- ifelse(df$FlagA == 1 & !is.na(df$FlagA) & df$FlagB == 0, 1, 0)
df

         ID FlagA FlagB FlagAB
1  28602363     1     0      1
2  28605734     0     1      0
3  28608629     1     0      1
4  28611734     1     0      1
5  28619822    NA     0      0
6  28622689     1     1      0
7  28650295    NA     1      0
8  28650378     0     1      0
9  28651602     1     1      0
10 28656060     1     0      1

编辑

如下所述,您实际上不需要使用 ifelse,因为结果是一个逻辑向量。

as.numeric(df$FlagA == 1 & !is.na(df$FlagA) & df$FlagB == 0)

你也可以试试这个:

df$FlagAB <- 1*(df$FlagA & !df$FlagB & !is.na(df$FlagA))
> df
#         ID FlagA FlagB FlagAB
#1  28602363     1     0      1
#2  28605734     0     1      0
#3  28608629     1     0      1
#4  28611734     1     0      1
#5  28619822    NA     0      0
#6  28622689     1     1      0
#7  28650295    NA     1      0
#8  28650378     0     1      0
#9  28651602     1     1      0
#10 28656060     1     0      1

括号 returns 中的表达式是一个逻辑向量,即数据帧的每一行的值 TRUE/FALSE 的向量。通过使用逻辑 AND 运算符 & 连接各个表达式,我们得到的结果只有 TRUE if

  • FlagA 不等于零并且
  • FlagB 等于零并且
  • FlagA 不是 NA

在所有其他情况下,结果为 FALSE

在这种情况下,结果逻辑向量与 1 的乘积与函数 as.numeric() 具有相同的效果:条目 FALSETRUE 被强制转换为数值 01

最后,结果存储在数据框中名为 FlagAB 的新列中。

数据

 df <- structure(list(ID = c(28602363L, 28605734L, 28608629L, 28611734L, 
        28619822L, 28622689L, 28650295L, 28650378L, 28651602L, 28656060L), 
        FlagA = c(1L, 0L, 1L, 1L, NA, 1L, NA, 0L, 1L, 1L), FlagB = c(0L, 
        1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L)), 
        .Names = c("ID", "FlagA", "FlagB"), class = "data.frame", 
        row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"))

另一种方法是在与条件进行比较之前合并两列,这样我们就不必关心 NA,因为它们无论如何都会 return 为 FALSE。

x$FlagAB <- (paste(x$FlagA, x$FlagB) == paste(1,0))*1

输出:

         ID FlagA FlagB FlagAB
1  28602363     1     0      1
2  28605734     0     1      0
3  28608629     1     0      1
4  28611734     1     0      1
5  28619822    NA     0      0
6  28622689     1     1      0
7  28650295    NA     1      0
8  28650378     0     1      0
9  28651602     1     1      0
10 28656060     1     0      1

其他选项是创建列,然后将 NA 替换为零:

x$FlagAB <- with(x, FlagA == 1 & FlagB == 0)*1
x$FlagAB[is.na(x$FlagAB)] <- 0