我有分组变量和文本的行。我希望使用 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}}
答案 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]