【问题标题】:How do you use if or ifelse in magrittr %>%?你如何在 magrittr %>% 中使用 if 或 ifelse?
【发布时间】:2017-03-13 03:41:54
【问题描述】:

我想将下面的函数应用于数据框的变量名称。但是为了这个问题,我将使用向量代替(因为 names(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")

这样,我会将“123”粘贴到 vec1,将“456”粘贴到元素末尾的 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="_"))

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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    问题是管道%&gt;% 将您的向量(前一个操作的结果)作为第一个参数传递给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"
    > 
    

    【讨论】:

    • 您可以通过%&lt;&gt;% 更新管道操作的左侧。即foo &lt;- foo %&gt;% barfoo %&lt;&gt;% bar相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2018-04-17
    • 2021-12-06
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多