gpt4 book ai didi

r - 如何使用 curly curly 将值转换为数字并过滤掉函数内的 NA?

转载 作者:行者123 更新时间:2023-12-05 00:43:03 24 4
gpt4 key购买 nike

我想要一个小标题(或数据框),将其中一列转换为数字,只选择同一列加上第三列,然后过滤掉 NA。

给定以下数据:

library(tidyverse)

set.seed(1)

mytib <- tibble(a = as.character(c(1:5, NA)),
b = as.character(c(6:8, NA, 9:10)),
c = as.character(sample(x = c(0,1), size = 6, replace = TRUE)))

vars <- c("a", "b")

我已经创建了以下函数

convert_tib <- function(var, tib){
tib <- tib %>%
mutate("{var}" = as.numeric({{ var }})) %>%
dplyr::select({{ var }}, c) %>%
filter(!is.na({{ var }}))
return(tib)
}

然后使用 purrr:map 运行它

map(vars, ~ convert_tib(var = ., tib = mytib))

不幸的是,这段代码的输出没有将向量转换为数字,也没有过滤掉 NA。我在函数内部尝试了许多不同的策略,例如 ensym(var)enquo(var) 并省略了 curly-curly 运算符。

我想要得到的是以下内容:

> map(vars, ~ convert_tib(var = ., tib = mytib))
[[1]]
# A tibble: 5 × 2
a c
<int> <int>
1 1 0
2 2 1
3 3 0
4 4 0
5 5 1

[[2]]
# A tibble: 5 × 2
b c
<int> <int>
1 6 0
2 7 1
3 8 0
4 9 1
5 10 0

最佳答案

你可以试试这个。我在您的自定义函数中使用了 ensym 函数,因为我注意到您希望将变量名称指定为字符串。然后我还使用了 !! 称为 big bang 运算符来取消引用它。最后你还需要 := 来定义一个自定义变量名来代替 =:

library(dplyr)
library(rlang)
library(purrr)

convert_tib <- function(var, tib){
var <- ensym(var)
tib <- tib %>%
dplyr::select(!!var, c) %>%
mutate(!!var := as.integer(!!var),
c = as.integer(c)) %>%
filter(!is.na(!!var))
return(tib)
}

map(vars, convert_tib, mytib)

输出:

[[1]]
# A tibble: 5 x 2
a c
<int> <int>
1 1 0
2 2 1
3 3 0
4 4 0
5 5 1

[[2]]
# A tibble: 5 x 2
b c
<int> <int>
1 6 0
2 7 1
3 8 0
4 9 1
5 10 0

关于r - 如何使用 curly curly 将值转换为数字并过滤掉函数内的 NA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71641199/

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