取消列出并拆分列以添加到行而不会丢失 R 中其他列的信息

unlist and split a column to add to rows without losing information of other column in R

我有一个带有特殊字符 ";" 的列,我想将其分成新行而不丢失其他列的信息。

比方说,这是我的 df:

col1  year
A;B    2010
A      2010
B      2011
B;C    2012

想要的结果:

col1  year
A      2010
B      2010
A      2010
B      2011
B      2012
C      2012

我知道如何使用 strsplit 分离 col1 :

unlist(strsplit(df[,1], ";")

但这并没有保留其他列的信息。

我们可以使用separate_rows

library(tidyr)
separate_rows(df, col1, sep = ";")

如果我们想使用 strsplit,则必须 rep根据 list 个元素的 length 对行进行排序 (lengths)

lst1 <- strsplit(df$col1, ";")
df1 <- df[rep(seq_len(nrow(df)), lengths(lst1)),]
df1$col1 <- unlist(lst1)

另一种选择是使用 unnest:

library(dplyr)
library(tidyr)

df %>% 
  mutate(col1=strsplit(col1, ";")) %>% 
  unnest(col1)
  col1   year
  <chr> <int>
1 A      2010
2 B      2010
3 A      2010
4 B      2011
5 B      2012
6 C      2012

基本的 R 方式。

do.call(rbind.data.frame, Map(cbind, strsplit(dat$col1, ";"), dat$year)) |>
  setNames(names(dat))
#   col1 year
# 1    A 2010
# 2    B 2010
# 3    A 2010
# 4    B 2011
# 5    B 2012
# 6    C 2012

数据:

dat <- structure(list(col1 = c("A;B", "A", "B", "B;C"), year = c(2010L, 
2010L, 2011L, 2012L)), class = "data.frame", row.names = c(NA, 
-4L))