【发布时间】:2019-12-31 03:16:26
【问题描述】:
我想检查数据框两列中的值是否不匹配,并使用此信息创建一个新列。我想使用dplyr::mutate,并且我希望能够处理NA 值。可以使用以下代码生成一个简单的示例:
library(dplyr)
let <- c("a", "b", NA)
LET <- c("A")
perms <- expand.grid(
let_2 = let,
LET_2 = LET,
let_1 = let,
LET_1 = LET,
stringsAsFactors = FALSE
) %>%
.[ncol(.):1]
> perms
LET_1 let_1 LET_2 let_2
1 A a A a
2 A a A b
3 A a A <NA>
4 A b A a
5 A b A b
6 A b A <NA>
7 A <NA> A a
8 A <NA> A b
9 A <NA> A <NA>
然后我想检查1 组中的参数是否与2 组中的相同参数不匹配。这是所需的输出:
> good_perms
LET_1 let_1 LET_2 let_2 LET_mismatch let_mismatch
1 A a A a FALSE FALSE
2 A a A b FALSE TRUE
3 A a A <NA> FALSE TRUE
4 A b A a FALSE TRUE
5 A b A b FALSE FALSE
6 A b A <NA> FALSE TRUE
7 A <NA> A a FALSE TRUE
8 A <NA> A b FALSE TRUE
9 A <NA> A <NA> FALSE FALSE
我认为下面的代码应该可以工作,但它给出了以下输出:
good_perms1 <- perms %>%
dplyr::mutate(LET_mismatch = !isTRUE(LET_1 == LET_2)) %>%
dplyr::mutate(let_mismatch = !isTRUE(let_1 == let_2))
> good_perms1
LET_1 let_1 LET_2 let_2 LET_mismatch let_mismatch
1 A a A a TRUE TRUE
2 A a A b TRUE TRUE
3 A a A <NA> TRUE TRUE
4 A b A a TRUE TRUE
5 A b A b TRUE TRUE
6 A b A <NA> TRUE TRUE
7 A <NA> A a TRUE TRUE
8 A <NA> A b TRUE TRUE
9 A <NA> A <NA> TRUE TRUE
此代码也无法提供所需的输出:
good_perms2 <- perms %>%
dplyr::mutate(LET_mismatch = isFALSE(LET_1 == LET_2)) %>%
dplyr::mutate(let_mismatch = isFALSE(let_1 == let_2))
> good_perms2
LET_1 let_1 LET_2 let_2 LET_mismatch let_mismatch
1 A a A a FALSE FALSE
2 A a A b FALSE FALSE
3 A a A <NA> FALSE FALSE
4 A b A a FALSE FALSE
5 A b A b FALSE FALSE
6 A b A <NA> FALSE FALSE
7 A <NA> A a FALSE FALSE
8 A <NA> A b FALSE FALSE
9 A <NA> A <NA> FALSE FALSE
如果我使用下面的代码,我会在定义值时得到预期的结果,但我得到的是 NA 而不是预期的结果:
-
FALSE当其中一个值为NA -
TRUE当两个值都是NA
good_perms2 <- perms %>%
dplyr::mutate(LET_mismatch = (LET_1 != LET_2)) %>%
dplyr::mutate(let_mismatch = (let_1 != let_2))
> good_perms2
LET_1 let_1 LET_2 let_2 LET_mismatch let_mismatch
1 A a A a FALSE FALSE
2 A a A b FALSE TRUE
3 A a A <NA> FALSE NA
4 A b A a FALSE TRUE
5 A b A b FALSE FALSE
6 A b A <NA> FALSE NA
7 A <NA> A a FALSE NA
8 A <NA> A b FALSE NA
9 A <NA> A <NA> FALSE NA
我意识到这里可能存在三个问题,但第一个是我最困惑的:
- 为什么
dplyr::mutate对!isTRUE("a" == "a")和!isTRUE("a" == "b")都将!isTRUE评估为TRUE?isFALSE也是如此。 - 我如何(最好是在一个函数中)将
NA == "a"识别为FALSE,将NA == NA识别为TRUE?
NAs 的问题可能需要单独解决,我现在主要关心的是为什么!isTRUE 在dplyr::mutate 中的行为不符合预期。谢谢!
附: This post 涉及到这个问题,但是通过不同的方式解决了。
【问题讨论】:
-
先看看
isTRUE(perms$let_1 == perms$let_2)给出了什么。isTRUE没有被它的外观矢量化。来自?isTRUE"'isTRUE(x)' 是 'identical(TRUE, x)' 的缩写,当且仅当 'x' 是长度为一的逻辑向量时才为真" -
我也无法复制您的 1. 查询 -
!isTRUE("a" == "a")提供FALSE而!isTRUE("a" == "b")提供TRUE -
@thelatemail,对于你的第二点,我应该说“来自
dplyr::mutate”。对于您的第一点,我曾认为mutate评估!isTRUE(perms$let_1[1] == perms$let_2[1]然后评估!isTRUE(perms$let_1[2] == perms$let_2[1],但您让我意识到mutate评估!isTRUE(perms$let_1 == perms$let_2。我需要编写isTRUE的矢量化版本来处理我对NA的特定标准。谢谢。