gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:11:11 25 4
gpt4 key购买 nike

我有带有分组变量和文本的行。我想用数据表当分组变量连续 n 次都相同时粘贴文本。

这是我所拥有的:

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

期望的输出:
     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

MWE:
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)

最佳答案

我们可以使用 rleid来自 data.table 的开发版根据“x”和“y”变量创建分组变量(“gr”)。按'gr'分组,我们得到'x'、'y'和paste的第一个元素'z' 元素在一起。

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

注意:安装开发版的说明是 here

如果我们不使用 devel 版本,另一种选择是通过比较 paste 之后的相邻元素来创建 'gr' 变量。 'x' 和 'y' 列,然后像以前一样继续。
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

这也会在原始数据集中分配“gr”列。我们可以将“gr”分配给 NULL保持原来的结构不变。
dat[, gr:= NULL]

而不是做 x=x[1L], y= y[1L] ,我们可以使用 'x'、'y' 和 'gr' 作为分组变量并只返回 'z' 列。
res <- dat[,list(z=paste(z, collapse=' ')) ,.(x, y, gr)][, gr:= NULL][]
dat[, gr:= NULL]

关于r - 通过多个分组顺序变量折叠和粘贴文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32409313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com