2017-09-13 53 views
0

我想在函數中使用列名稱,而不明確地將其作爲參數傳遞給該函數,在整數中調用(dplyrtidyrpurrr,...)管道。這是因爲我想在許多列上使用此函數(例如,分別使用mutate_allmap),而不是分別使用每個列的mutate獲取一列的名稱作爲一個額外的參數,以在mutate_all整齊管道中起作用

例子:

比方說,我想在每列值由列名和下劃線作爲前綴。以下作品:

library(dplyr) 
library(purrr) 
library(stringr) 

tib <- tibble(a = 1:3, b = 4:6, c = 7:9) 

f <- function(value, column_name) { 
    str_c(column_name, "_", value) 
} 

tib %>% 
    mutate(a = map_chr(a, f, "a"), 
     b = map_chr(b, f, "b"), 
     c = map_chr(c, f, "c")) 

# A tibble: 3 x 3 
    a  b  c 
<chr> <chr> <chr> 
1 a_1 b_4 c_7 
2 a_2 b_5 c_8 
3 a_3 b_6 c_9 

但是,如果我有n >> 3列?

這將是很好,有其自身找出列名的函數,然後我可以使用mutate_all

f2 <- function(value) { 
    column_name <- miraculously_get_column_name() 
    str_c(column_name, "_", value) 
} 

tib %>% 
    mutate_all(f2) 

但是,這沒有發生。一個可能更爲現實的願望是作爲一個額外的參數輸入到mutate_all它發現列名每列的表達式並使用原f,是這樣的:

tib %>% 
    mutate_all(f, get_column_name_somehow()) 

那麼,如何做到這一點與管道(如果還有其他方法,並且沒有辦法用一個整潔的管道做這件事,那就讓我們來做吧)。

回答

3

你可以這樣來做:

tib %>% map2_df(names(.),f) 

或者像@aosmith提到在評論您可以使用imap_dfc這是準確的回答你的問題:

tib %>% imap_dfc(f) 
+0

這是驚人的,我唯一的問題是我不明白。但是,對我來說,謝謝。 'map2_dfr'? 「map2_df」發生了什麼? –

+0

yes'map_df'也可以,它在包索引中,但是doc,'map_df','map_dfr'和'map_dfc'沒有提到,在這裏給出了相同的結果 –

+0

'names(。)'中的點調用主輸入,在這種情況下,'tib' –

相關問題