簡體   English   中英

mutate_at中的復合函數

[英]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]>

我想替換在列中的缺失值twothree與列的值one使用coalesce()然后在折疊每個字符向量(橫行) twothree使用成一個字符串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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM