你如何在magrittr%>%中使用if或ifelse?

时间:2017-03-13 03:41:55

标签: r dplyr

我想将以下函数应用于数据帧的变量名称。但是为了这个问题,我将使用向量代替(因为名称(df)也是一个向量)。

我想首先,(1)将向量元素中的所有字符转换为大写,然后,(2)用" _"替换所有中间空格。最后,(3)将特定字符填充到向量中每个元素的末尾。这是我写的功能:

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")

这样,我会粘贴&#34; 123&#34;到vec1,&#34; 456&#34;到元素末尾的vec2。我不想粘贴任何东西到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"

我收到了错误:

  

错误:condition必须是逻辑

我认为它必须与if_else行有关,所以我尝试了:

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

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

但他们不会工作。有什么建议?感谢。

1 个答案:

答案 0 :(得分: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"
>