簡體   English   中英

如何跨多個變量 map 自定義 function

[英]How to map custom function across multiple variables

我寫了一個 function 來確定對於給定變量,組中的值是否不相同,並創建一個新變量,如果有差異則提供變量的名稱,如果沒有差異則提供 NA。

x <- c(2,4,5,5,6,2,3)
y <- c(5,5,2,3,6,1,8)
z <- c(5,2,4,1,3,5,1)
xy <- tibble(x, y, z)

diff_var <- function(a, b) {
 a %>% 
    transmute("{{c}}" := n_distinct({{c}})) %>% 
    ungroup() %>% 
    select({{c}}) %>% 
    imap_dfc(~ if_else(.x > 1, .y, NA_character_))
}

xy %>% 
  group_by(x) %>% 
  diff_var(., y)

# A tibble: 7 × 1
  y    
  <chr>
1 y    
2 NA   
3 y    
4 y    
5 NA   
6 y    
7 NA   

我現在正試圖弄清楚如何跨多個變量執行此操作(理想情況下不包括分組變量)。 對於此處的樣本數據,y 和 z。 分組依據的變量對於所有變量都是相同的。 我使用 map 的不同 forms 的各種嘗試都失敗了; 我正在努力將 arguments 准確地放入我的自定義 function 中。 最終,我希望包含分組變量,但我可以稍后輕松地將其添加回來。

所需的 output:

# A tibble: 7 × 2
  y     z    
  <chr> <chr>
1 y     NA   
2 NA    NA   
3 y     z    
4 y     z    
5 NA    NA   
6 y     NA   
7 NA    NA  

雖然這個網站上有類似標題的問題,但我無法將它們調整到我目前的案例中。

c across使用和傳遞列名向量可能更容易。 此外,最后一步可以在dplyr本身內完成,即使用across

diff_var <- function(a, c) {
 a %>% 
    transmute(across(all_of(c), n_distinct)) %>% 
    ungroup() %>% 
    select(all_of(c)) %>% 
    mutate(across(everything(), ~ case_when(.x > 1~ cur_column())))
}

-測試

xy %>% 
   group_by(x) %>% 
   diff_var(., c("y", "z"))
# A tibble: 7 × 2
  y     z    
  <chr> <chr>
1 y     <NA> 
2 <NA>  <NA> 
3 y     z    
4 y     z    
5 <NA>  <NA> 
6 y     <NA> 
7 <NA>  <NA> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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