取消列出并拆分列以添加到行而不会丢失 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))
我有一个带有特殊字符 ";"
的列,我想将其分成新行而不丢失其他列的信息。
比方说,这是我的 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))