【问题标题】:How to concatenete strings after str_split如何在strsplit之后连接字符串
【发布时间】:2019-03-14 06:35:57
【问题描述】:

给定这个数据框

column_1     column_2
A            w,x
B            z 
C            q,r,s

我想要的输出是

"Aw", "Ax", "Bz", "Cq", "Cr", "Cs"

我试过了

paste0(df$column_1, strsplit(df$column_2, ","))

但是输出是

"Ac(\"w\", \"x\")"  "Bz"  "Cc(\"q\", \"r\", \"s\")"

【问题讨论】:

    标签: r paste strsplit


    【解决方案1】:

    我们可以将column_2 拆分为“,”,然后使用mapply 将它们与column_1 粘贴在一起

    unlist(mapply(paste0, df$column_1,strsplit(df$column_2, ",")))
    #[1] "Aw" "Ax" "Bz" "Cq" "Cr" "Cs"
    

    【讨论】:

    • 这个很简单。
    【解决方案2】:

    我们可以通过listlengthsstrsplit 输出replicate 'column_1',然后执行paste

     lst1 <- strsplit(df$column_2, ",")
     paste0(rep(df$column_1, lengths(lst1)), unlist(lst1))
     #[1] "Aw" "Ax" "Bz" "Cq" "Cr" "Cs"
    

    注意:以上是矢量化方法,因为我们没有循环通过 list


    或者使用stacklist然后paste创建一个两列data.frame

     do.call(paste0, stack(setNames(lst1, df$column_1))[2:1])
     #[1] "Aw" "Ax" "Bz" "Cq" "Cr" "Cs"
    

    stack使用两列 data.frame 方法可能比第一种方法效率低一些


    或者使用tidyverse,将“column_2”拆分为长格式,使用separate_rows,然后将unite两列和pull拆分为vector

    library(tidyverse)
    df %>% 
        separate_rows(column_2) %>%
        unite(newcol, column_1, column_2, sep="") %>%
        pull(newcol)
    #[1] "Aw" "Ax" "Bz" "Cq" "Cr" "Cs"
    

    OP 方法中的问题是基于strsplit 输出是listvectors 的事实。我们需要一个函数将list (lapply/sapply/vapply) 或unlist list 循环到vectorreplicating the 'column_1' (在length 期间生成lengthing)

    数据

    df <- structure(list(column_1 = c("A", "B", "C"), column_2 = c("w,x", 
     "z", "q,r,s")), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

      【解决方案3】:

      这也可以使用下面的代码来实现。虽然不是很地道

      df <- data.frame(column_1 = c("A", "B", "C"), column_2 = c("w,x", "z", "q,r,s"))
      l_vals <- strsplit(as.character(df$column_2), split = ",", perl =TRUE)
      l_append = list()
      for(i in seq_along(l_vals)){
        l_append <- c(l_append,paste0(df$column_1[i], l_vals[[i]]))
      }
      
      unlist(l_append)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-21
        • 1970-01-01
        • 2020-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-17
        相关资源
        最近更新 更多