gpt4 book ai didi

r - 在 mutate_if 调用中提取列名

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

我想提取 mutate_if 函数调用中的列名称。有了这个,我想在 a 中查找一个值不同的表并用查找值填充缺失值。我尝试使用 quosure 语法,但它不起作用。是否可以直接提取列名?

示例数据

df <- structure(list(x = 1:10, 
y = c(1L, 2L, 3L, NA, 1L, 2L, 3L, NA, 1L, 2L),
z = c(NA, 2L, 3L, NA, NA, 2L, 3L, NA, NA, 2L),
a = c("a", "b", "c", "d", "e", "a", "b", "c", "d", "e")),
.Names = c("x", "y", "z", "a"),
row.names = c(NA, -10L),
class = c("tbl_df", "tbl", "data.frame"))
df_lookup <- tibble(x = 0L, y = 5L, z = 8L)

不工作

直接以某种方式提取名称是行不通的。

df %>% 
mutate_if(is.numeric, funs({
x <- .
x <- enquo(x)
lookup_value <- df_lookup %>% pull(quo_name(x))
x <- ifelse(is.na(x), lookup_value, x)
return(x)
}))

通过额外的功能,我可以提取名称,但替换功能不再起作用。

custom_mutate <- function(v) {
v <- enquo(v)
lookup_value <- df_lookup %>% pull(quo_name(v))

# ifelse(is.na((!!v)), lookup_value, (!!v))
}

df %>%
mutate_if(is.numeric, funs(custom_mutate(v = .)))

作品

如果我将 df 作为附加参数添加到我的自定义函数中,它就可以工作,但是有没有办法不这样做呢?感觉不对,而且不是 dplyr 的本意...如果我错了,请纠正我;)
除此之外,我必须使用 UQE 而不是 !! ,正如 Programming with dplyr 中所述。 :

UQE() is for expert use only

custom_mutate2 <- function(v, df) {
v <- enquo(v)
lookup_value <- df_lookup %>% pull(quo_name(v))

df %>%
mutate(UQE(v) := ifelse(is.na((!!v)), lookup_value, (!!v))) %>%
pull(!!v)
}

df %>%
mutate_if(is.numeric, funs(custom_mutate2(v = ., df = df)))

预期输出

# A tibble: 10 x 4
# x y z a
# <int> <int> <int> <chr>
# 1 1 1 8 a
# 2 2 2 2 b
# 3 3 3 3 c
# 4 4 5 8 d
# 5 5 1 8 e
# 6 6 2 2 a
# 7 7 3 3 b
# 8 8 5 8 c
# 9 9 1 8 d
# 10 10 2 2 e

最佳答案

您必须使用quo而不是enquo

#enquo(.) :
<quosure: empty>
~function (expr)
{
enexpr(expr)
}
...

#quo(.) :
<quosure: frame>
~x
<quosure: frame>
~y
<quosure: frame>
~z

以你的例子:

mutate_if(df, is.numeric, funs({
lookup_value <- df_lookup %>% pull(quo_name(quo(.)))
ifelse(is.na(.), lookup_value, .)
}))

# A tibble: 10 x 4
x y z a
<int> <int> <int> <chr>
1 1 1 8 a
2 2 2 2 b
3 3 3 3 c
4 4 5 8 d
5 5 1 8 e
6 6 2 2 a
7 7 3 3 b
8 8 5 8 c
9 9 1 8 d
10 10 2 2 e

关于r - 在 mutate_if 调用中提取列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48868208/

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