Как конкатенировать строки после str_split - PullRequest
1 голос
/ 14 марта 2019

Учитывая этот фрейм данных

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

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Мы можем разделить column_2 на "," и вставить их с помощью column_1, используя mapply

unlist(mapply(paste0, df$column_1,strsplit(df$column_2, ",")))
#[1] "Aw" "Ax" "Bz" "Cq" "Cr" "Cs"
1 голос
/ 14 марта 2019

Мы можем rep лицензировать 'column_1' с помощью lengths из list вывода из strsplit, а затем выполнить paste

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

ПРИМЕЧАНИЕ. Выше приведена векторизацияподход, поскольку мы не перебираем list


Или используем stack для создания двухколоночного data.frame из list, а затем paste

 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"

Проблема в подходе ОП основана на том факте, что вывод strsplit является list из vector с.Нам нужна функция для циклического перебора list (lapply/sapply/vapply) или unlist list в vector, тогда как replicating the 'column_1' (чтобы сделать length во время paste ing)

данные

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))
0 голосов
/ 14 марта 2019

Этого также можно добиться, используя приведенный ниже код. Хотя не очень идиоматичный

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...