通过比较 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()
具有相同的效果:条目 FALSE
和 TRUE
被强制转换为数值 0
和 1
。
最后,结果存储在数据框中名为 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
如何创建一个新的二进制变量来比较现有数据框中的其他两个二进制变量?
对于数据框"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()
具有相同的效果:条目 FALSE
和 TRUE
被强制转换为数值 0
和 1
。
最后,结果存储在数据框中名为 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