[英]Composite functions in mutate_at
我有一個t ::
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]>
我想替換在列中的缺失值two
和three
與列的值one
使用coalesce()
然后在折疊每個字符向量(橫行) two
和three
使用成一個字符串toString()
我的預期輸出如下:
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"
在上面的例子中,我們使用的λ式的表達式中使用~
使用它作為一個函數,它是真funs
已棄用,已被替換為list()
來代替。 這個問題的答案和評論提供了更多的洞察力。
使用tidyverse
,我們可以使用pmap
library(tidyverse)
out <- df %>%
mutate_at(vars(two, three),
list(~ pmap(list(., one), ~ list(...) %>%
reduce(coalesce) %>%
toString)))
out
# A tibble: 2 x 3
# one two three
# <chr> <list> <list>
#1 a <chr [1]> <chr [1]>
#2 b <chr [1]> <chr [1]>
out$two
#[[1]]
#[1] "p1, p2, p3"
#[[2]]
#[1] "b"
out$three
#[[1]]
#[1] "a"
#[[2]]
#[1] "z1, z2, z3"
或者使用base R
Map
df[-1] <- lapply(df[-1], function(x) do.call(Map,
c(f = function(x, y) toString(coalesce(x, y)), list(x, df$one))))
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$two
#[[1]]
#[1] "p1, p2, p3"
#[[2]]
#[1] "b"
df$three
#[[1]]
#[1] "a"
#[[2]]
#[1] "z1, z2, z3"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.