gpt4 book ai didi

r - mutate_at 中的复合函数

转载 作者:行者123 更新时间:2023-12-04 13:11:56 25 4
gpt4 key购买 nike

我有一个问题:

df = tibble(one = list('a', 'b'), two = list(c('p1', 'p2', 'p3'), NA_character_), three = list(NA_character_, c('z1', 'z2', 'z3')))

df
# A tibble: 2 x 3
one two three
<chr> <list> <list>
1 a <chr [3]> <chr [1]>
2 b <chr [1]> <chr [3]>

我想使用 coalesce() 将 twothree 列中的缺失值替换为 one 列的值,然后使用 toString()twothree 中的每个字符向量(按行)折叠成单个字符串。我的预期输出如下所示:

df = tibble(one = c('a', 'b'), two = list('p1, p2, p3', 'b'), three = list('a', 'z1, z2, z3'))
df
# A tibble: 2 x 3
one two three
<chr> <list> <list>
1 a <chr [1]> <chr [1]>
2 b <chr [1]> <chr [1]>

这是我最初尝试的:

df %>% mutate_at(vars(two, three), funs(coalesce(., one) %>% map(., toString)))

我知道 funs() 引用了它的参数,但我不明白为什么它不适用于管道。该文档还建议 funs 已被弃用,但我不确定在其位置使用什么。我想知道是否有人可以阐明为什么上述内容不起作用,因为我一点也不熟悉作用域动词的内部工作原理。

最佳答案

我们可以使用 map2 ,使用 coalesce 然后使用 toString

library(dplyr)
library(purrr)

df1 <- df %>%
mutate_at(vars(two, three), ~map2(., one, ~toString(coalesce(.x, .y))))

df1

# one two three
# <chr> <list> <list>
#1 a <chr [1]> <chr [1]>
#2 b <chr [1]> <chr [1]>

df1$two
#[[1]]
#[1] "p1, p2, p3"

#[[2]]
#[1] "b"

df1$three
#[[1]]
#[1] "a"

#[[2]]
#[1] "z1, z2, z3"

在上面的例子中,我们使用 ~ 的 lambda 风格表达式来将它用作一个函数,这是真的 funs 已被弃用,并已被替换为 list() 代替。 this question中的答案和评论提供了对此的更多见解。

关于r - mutate_at 中的复合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56712729/

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