2016-08-29 567 views
21

我想使用dplyr的mutate_at函數將函數應用於數據框中的多個列,其中函數輸入直接應用的列以及另一列在數據框中。在dplyr中使用多列函數mutate_at調用

舉一個具體的例子,我想看看發生變異以下數據框

# Example input dataframe 
df <- data_frame(x = c(TRUE, TRUE, FALSE), 
       y = c("Hello", "Hola", "Ciao"), 
       z = c("World", "ao", "HaOlam") 
       ) 

mutate_at調用類似於這樣

df %>% 
mutate_at(.vars = vars(y, z), 
      .funs = ifelse(x, ., NA) 
     ) 

返回一個數據幀,看起來是這樣的

# Desired output dataframe 
df2 <- data_frame(x = c(TRUE, TRUE, FALSE), 
        y_1 = c("Hello", "Hola", NA), 
        z_1 = c("World", "ao", NA) 
       ) 

期望的mutate_at通話將類似於以下調用mutate

df %>% 
    mutate(y_1 = ifelse(x, y, NA), 
      z_1 = ifelse(x, z, NA) 
     ) 

我知道,這可以在基礎R以多種方式來完成,但是我特別喜歡用dplyr的mutate_at功能的緣故來實現這一目標可讀性,與數據庫接口等

下面是問在計算器一些類似的問題,其地址我在這裏提出的問題:

adding multiple columns in a dplyr mutate call

dplyr::mutate to add multiple values

Use of column inside sum() function using dplyr's mutate() function

+13

'DF%>% mutate_at(VARS(Y,Z), 玩意兒(ifelse(X,。 ,NA)))' – eipi10

+0

@ eipi10啊,好的。因此,如果我在調用'funs()'時實際上包裝了'ifelse(x,。,NA)',上面的代碼就可以工作。謝謝!我檢查了您的解決方案,並且完美地工作。 您的解決方案正是我一直在尋找的! – bschneidr

回答

26

這在@ eipi10對這個問題的評論回答@ eipi10,但我在這裏寫它爲後人。

這裏的解決方案是使用:

df %>% 
    mutate_at(.vars = vars(y, z), 
      .funs = funs(ifelse(x, ., NA))) 

採用funs()這裏表示ifelse(x, ., NA)是正在通話中定義爲mutate_at()匿名函數。

此工作方式類似於定義函數的調用的外部到mutate_at(),像這樣:

temp_fn <- function(input) ifelse(test = df[["x"]], 
            yes = input, 
            no = NA) 

df %>% 
    mutate_at(.vars = vars(y, z), 
      .funs = temp_fn) 
相關問題