仅使用基本 R 将多列字符串拆分为单独的行

问题描述 投票:0回答:1

我尝试使用基本 R 来使用这篇文章中的答案:将字符串拆分为 R 中的新行

split_dfcheck <- as.data.frame(do.call(rbind, apply(test, 1, function(x) {
  do.call(expand.grid, strsplit(x, " *; *"))
})))

但是,当我在示例数据上使用它时:

test <-data.frame(name=c("Andrea;barbara;erica;Matteo","Matteo;sonia;marta","Matteo;sonia","sonia;marta;matteo" ),  code=c("A", "A", "B", "B"),number=c(1,1,2,2),
                  surname=c("surname1;surname2;surname3;surname4", "surname1;surname2;surname3", "surname1;surname2","surname1;surname2;surname3"))

使用时我得到 38 行

separate_rows
我得到 12 行:

test1 <- test %>%
  separate_rows(c(name,surname), , sep = ";")

有没有办法获得与

separate_rows
相同的结果,但使用基本 R?

谢谢!

r tidyr radix
1个回答
0
投票

你可以这样做:

test2 <- do.call("rbind", lapply(seq(nrow(test)), function(i) {
  data.frame(name = strsplit(test$name[i], ';')[[1]], 
             code = test$code[i], number = test$number[i],
             surname = strsplit(test$surname[i], ';')[[1]])
}))

这会导致

test2
#>       name code number  surname
#> 1   Andrea    A      1 surname1
#> 2  barbara    A      1 surname2
#> 3    erica    A      1 surname3
#> 4   Matteo    A      1 surname4
#> 5   Matteo    A      1 surname1
#> 6    sonia    A      1 surname2
#> 7    marta    A      1 surname3
#> 8   Matteo    B      2 surname1
#> 9    sonia    B      2 surname2
#> 10   sonia    B      2 surname1
#> 11   marta    B      2 surname2
#> 12  matteo    B      2 surname3
© www.soinside.com 2019 - 2024. All rights reserved.