如何在 str_split 之后连接字符串

How to concatenete strings after str_split

给定这个数据框

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

我们可以rep通过strsplit输出的listlengths关联'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 创建两列 data.frame 然后 paste

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

stack与第一种方法

相比,使用两列data.frame方法的效率可能会低一些

或者用tidyverse,用separate_rows把'column_2'拆分成长格式,然后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 输出是 vectorlist 这一事实。我们需要一个函数来循环 list (lapply/sapply/vapply) 或 unlistlist 转换为 vectorreplicating the 'column_1' (在 pasteing 期间制作 length

数据

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

我们可以在“,”上拆分 column_2,然后使用 mapply

将它们与 column_1 粘贴在一起
unlist(mapply(paste0, df$column_1,strsplit(df$column_2, ",")))
#[1] "Aw" "Ax" "Bz" "Cq" "Cr" "Cs"

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

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)