如何在 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
输出的list
的lengths
关联'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
或使用 stack
从 list
创建两列 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
输出是 vector
的 list
这一事实。我们需要一个函数来循环 list
(lapply/sapply/vapply
) 或 unlist
将 list
转换为 vector
而 replicating the
'column_1' (在 paste
ing 期间制作 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)
给定这个数据框
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
输出的list
的lengths
关联'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
或使用 stack
从 list
创建两列 data.frame 然后 paste
do.call(paste0, stack(setNames(lst1, df$column_1))[2:1])
#[1] "Aw" "Ax" "Bz" "Cq" "Cr" "Cs"
stack
与第一种方法
或者用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
输出是 vector
的 list
这一事实。我们需要一个函数来循环 list
(lapply/sapply/vapply
) 或 unlist
将 list
转换为 vector
而 replicating the
'column_1' (在 paste
ing 期间制作 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)