拆分列中的文本并添加行号
splitting text in column and add row number
我想拆分数据框列中的一些文本,并将其与行号或 ID 列一起保存到数据框中。
我通常使用 plyr 来执行此操作,但这在 dplyr 中不再有效。
如果我理解正确的话,它更像是 plyr 中的一个错误,我的代码可以正常工作,因为它是一个错误。
所以我正在寻找正确的方法。
这是 plyr 中的一个最小示例:
library(plyr)
set.seed(1)
df <- data.frame(a=seq(2),
b=c(paste(sample(letters,3), collapse=';'),
paste(sample(letters,3), collapse=';')),
stringsAsFactors=FALSE)
ddply(df,.(a),summarise,unlist(strsplit(b,';')))
转原数据框:
a b
1 1 g;j;n
2 2 x;f;v
进入这个:
a ..1
1 1 g
2 1 j
3 1 n
4 2 x
5 2 f
6 2 v
正确的 dplyr 解决方案是什么?
您可以使用 splitstackshape
中的 cSplit
来完成此操作
library(splitstackshape)
cSplit(df, 'b', ';', 'long')
# a b
#1: 1 g
#2: 1 j
#3: 1 n
#4: 2 x
#5: 2 f
#6: 2 v
或使用dplyr/tidyr
library(dplyr)
library(tidyr)
separate(df, b, c('b1', 'b2', 'b3'), sep=";") %>%
gather(Var, b, -a) %>%
select(-Var) %>%
arrange(a)
或者另一种选择是使用 do
df %>%
group_by(a) %>%
do(data.frame(b=unlist(strsplit(.$b, ';'))))
我偏向于 "splitstackshape" 包中的 cSplit
,但您可能对 "tidyr" 中的 unnest
与 [=17= 结合使用感兴趣]:
library(dplyr)
library(tidyr)
df %>%
mutate(b = strsplit(b, ";")) %>%
unnest(b)
# a b
# 1 1 g
# 2 1 j
# 3 1 n
# 4 2 x
# 5 2 f
# 6 2 v
我想拆分数据框列中的一些文本,并将其与行号或 ID 列一起保存到数据框中。
我通常使用 plyr 来执行此操作,但这在 dplyr 中不再有效。
如果我理解正确的话,它更像是 plyr 中的一个错误,我的代码可以正常工作,因为它是一个错误。
所以我正在寻找正确的方法。
这是 plyr 中的一个最小示例:
library(plyr)
set.seed(1)
df <- data.frame(a=seq(2),
b=c(paste(sample(letters,3), collapse=';'),
paste(sample(letters,3), collapse=';')),
stringsAsFactors=FALSE)
ddply(df,.(a),summarise,unlist(strsplit(b,';')))
转原数据框:
a b
1 1 g;j;n
2 2 x;f;v
进入这个:
a ..1
1 1 g
2 1 j
3 1 n
4 2 x
5 2 f
6 2 v
正确的 dplyr 解决方案是什么?
您可以使用 splitstackshape
cSplit
来完成此操作
library(splitstackshape)
cSplit(df, 'b', ';', 'long')
# a b
#1: 1 g
#2: 1 j
#3: 1 n
#4: 2 x
#5: 2 f
#6: 2 v
或使用dplyr/tidyr
library(dplyr)
library(tidyr)
separate(df, b, c('b1', 'b2', 'b3'), sep=";") %>%
gather(Var, b, -a) %>%
select(-Var) %>%
arrange(a)
或者另一种选择是使用 do
df %>%
group_by(a) %>%
do(data.frame(b=unlist(strsplit(.$b, ';'))))
我偏向于 "splitstackshape" 包中的 cSplit
,但您可能对 "tidyr" 中的 unnest
与 [=17= 结合使用感兴趣]:
library(dplyr)
library(tidyr)
df %>%
mutate(b = strsplit(b, ";")) %>%
unnest(b)
# a b
# 1 1 g
# 2 1 j
# 3 1 n
# 4 2 x
# 5 2 f
# 6 2 v