2017-03-13 48 views
1

我想將下面的函數應用於數據框的變量名稱。然而,爲了這個問題,我將使用矢量(因爲名稱(df)也是一個矢量)。 (1)將矢量元素中的所有字符轉換爲大寫,下一個,(2)用「_」替換所有的中間空格,最後,(3)將特定字符填充到向量中每個元素的結尾。這是我寫的函數:你如何使用if或ifelse在magrittr%>%?

pad <- function(vec,pastechr){ 
    names(vec) <- names(vec) %>% 
    toupper() %>% 
    str_replace_all(" ", "_") %>% 
    if_else(pastechr!="",paste(pastechr,sep="_"),paste0("")) 
} 

我想在3個向量應用此功能:

vec1 <- c("A","B B","C c") 
vec2 <- c("PP p","Q Q","r") 
vec3 <- c("x","y z") 

這樣,我會貼上「123」到VEC 1,「456」,以VEC 2在元素的末尾。我不想將任何東西粘貼到vec3。因此,

pad(vec1,"123") 
pad(vec2,"456") 
pad(vec3,"") 

我想出來的這個是什麼:

pad(vec1,"123") 
[1] "A_123","B_B_123","C_C_123" 

pad(vec2,"456") 
[1] "PP_P_456","Q_Q_456","R_456" 

pad(vec3,"") 
[1] "X","Y_Z" 

我得到一個錯誤,而不是:

Error: condition must be logical

我相信它一定有事情做與if_else線,所以我試過了:

if(pastechr!="") {paste(pastechr,sep="_")} 

if_else(pastechr=="",paste0(""),paste(pastechr,sep="_")) 

但他們不會工作。有什麼建議?謝謝。

回答

2

的問題是,經過%>%您的載體(前面操作的結果)作爲第一個參數ifelse(不if_else),但ifelse管道預計測試作爲第一個參數。另請注意,你的載體的namesNULL

我會使用類似:

library(magrittr) 
library(stringr) 

pad <- function(vec, pastechr){ 
    vec <- vec %>% 
    toupper() %>% 
    str_replace_all(" ", "_") 
    if (pastechr != "") { 
    vec <- paste(vec, pastechr, sep = "_") 
    } 
    vec 
} 

vec1 <- c("A","B B","C c") 
vec2 <- c("PP p","Q Q","r") 
vec3 <- c("x","y z") 

pad(vec1,"123") 
pad(vec2,"456") 
pad(vec3,"") 

導致:

> pad(vec1,"123") 
[1] "A_123" "B_B_123" "C_C_123" 
> pad(vec2,"456") 
[1] "PP_P_456" "Q_Q_456" "R_456" 
> pad(vec3,"") 
[1] "X" "Y_Z" 
> 
+1

您可以通過'%<>'%更新管操作的左手側。也就是說,'foo <- foo %>%bar'與'foo%<>%bar'相同 – Therkel