拆分列中的文本并添加行号

时间:2015-03-09 07:58:16

标签: r plyr dplyr

我想在数据框列中拆分一些文本,并将其与行号或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解决方案是什么?

2 个答案:

答案 0 :(得分:4)

您可以使用cSplit

中的splitstackshape执行此操作
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, ';'))))

答案 1 :(得分:4)

我偏向于&#34; splitstackshape&#34;的cSplit。包,但您可能对来自&#34; tidyr&#34;的unnest感兴趣与&#34; dplyr&#34;:

一起使用
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