通过多个分组顺序变量来折叠和粘贴文本

时间:2015-09-05 03:46:35

标签: r data.table

我有分组变量和文本的行。我希望使用 data.table 来粘贴文本,当分组变量连续n次都相同时。

以下是我所拥有的:

     x y                                                             z
1  Pre A                                Lorem ipsum dolor sit amet, ac
2  Pre C Maecenas netus in, lacus fames Conubia sed nulla dolor dui ap
3  Pre A Eget laoreet eros in aliquet e Vestibulum quisque himenaeos p
4 Post A Sed venenatis. Ante turpis ege Ultricies ultricies eleifend m
5 Post B                                Conubia in in sed etiam nec mo
6 Post A Quam nec ex sodales dictum orc Sed ante id pulvinar maximus s

期望的输出:

library(data.table)
library(stringi)

set.seed(12)
dat <- data.frame(
    x = rep(c("Pre", "Post"), each=5), 
    y = sample(LETTERS[1:3], 10, TRUE), 
    z = substring(stri_rand_lipsum(10), 1, 30), stringsAsFactors = FALSE
)

setDT(dat)

MWE:

{{1}}

1 个答案:

答案 0 :(得分:9)

我们可以使用rleid的开发版data.table来创建基于&#39; x&#39;的分组变量(&#39; gr&#39;)。并且&#39; y&#39;变量。通过&#39; gr&#39;分组,我们得到了&#39; x&#39;,&#39; y&#39;和paste的第一个元素&#39; z&#39;元素在一起。

library(data.table)#v1.9.5+
setDT(dat)[,list(x=x[1L], y= y[1L], z=paste(z, collapse = ' ')) ,
                      by = .(gr=rleid(x,y))][, gr:= NULL][]
#      x y                                                             z
#1:  Pre A                                Lorem ipsum dolor sit amet, ac
#2:  Pre C Maecenas netus in, lacus fames Conubia sed nulla dolor dui ap
#3:  Pre A Eget laoreet eros in aliquet e Vestibulum quisque himenaeos p
#4: Post A Sed venenatis. Ante turpis ege Ultricies ultricies eleifend m
#5: Post B                                Conubia in in sed etiam nec mo
#6: Post A Quam nec ex sodales dictum orc Sed ante id pulvinar maximus s

注意:安装devel版本的说明是here

如果我们不使用devel版本,另一个选择是创建&#39; gr&#39;通过比较paste&#39; x&#39;之后的相邻元素来变量并且&#39; y&#39;列然后像以前一样继续。

setDT(dat)[, gr:={gr= paste(x,y); cumsum(c(TRUE, gr[-1]!= gr[-.N]))}]
res <- dat[, list(x=x[1L], y=y[1L], z=paste(z, collapse=' ')) ,
                     by = gr][,gr:= NULL][]
res
#      x y                                                             z
#1:  Pre A                                Lorem ipsum dolor sit amet, ac
#2:  Pre C Maecenas netus in, lacus fames Conubia sed nulla dolor dui ap
#3:  Pre A Eget laoreet eros in aliquet e Vestibulum quisque himenaeos p
#4: Post A Sed venenatis. Ante turpis ege Ultricies ultricies eleifend m
#5: Post B                                Conubia in in sed etiam nec mo
#6: Post A Quam nec ex sodales dictum orc Sed ante id pulvinar maximus s

这也指定了&#39;&#39;原始数据集中的列。我们可以分配&#39; gr&#39;到NULL保持原始结构不变。

dat[, gr:= NULL]

我们可以使用&#39; x&#39;,&#39; y&#39;而不是x=x[1L], y= y[1L]。和&#39; gr&#39;作为分组变量并仅返回&#39; z&#39;列。

res <- dat[,list(z=paste(z, collapse=' ')) ,.(x, y, gr)][, gr:= NULL][]
dat[, gr:= NULL]