gpt4 book ai didi

r - isTRUE 和 isFALSE 在 dplyr mutate 函数中没有按预期工作

转载 作者:行者123 更新时间:2023-12-05 02:11:18 28 4
gpt4 key购买 nike

我想检查数据框两列中的值是否不匹配,并使用此信息创建一个新列。我想使用 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

我意识到这里可能存在三个问题,但第一个是我最困惑的:

  1. 为什么 dplyr::mutate!isTRUE 评估为 TRUE 两个 !isTRUE("a"== "a ")!isTRUE("a"== "b")isFALSE 也是如此。
  2. 我如何(最好在一个函数中)将 NA == "a" 识别为 FALSE 并将 NA == NA 识别为 ?

NA 的问题可能需要单独解决,我现在主要关心的是为什么 !isTRUE 中没有按预期运行dplyr::变异。谢谢!

附言This post涉及到这个问题,但通过不同的方式解决了。

最佳答案

也许将 NA 替换为字符“NA”,运行您的代码,然后将字符“NA”替换回 NA

library(dplyr)

good_perms2 <- perms %>%
mutate_all(list(~replace(., is.na(.), "NA"))) %>%
mutate(LET_mismatch = (LET_1 != LET_2)) %>%
mutate(let_mismatch = (let_1 != let_2)) %>%
mutate_all(list(~replace(., . %in% "NA", NA_character_)))
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 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

关于r - isTRUE 和 isFALSE 在 dplyr mutate 函数中没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57666231/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com