gpt4 book ai didi

根据前面的值按组替换值序列

转载 作者:行者123 更新时间:2023-12-03 15:39:13 26 4
gpt4 key购买 nike

我有这种形式的数据表(2000000+行,1000 +组):

set.seed(1)    
dt <- data.table(id = rep(1:3, each = 5), values = sample(c("a", "b","c"), 15, TRUE))

> dt
id values
1: 1 a
2: 1 c
3: 1 a
4: 1 b
5: 1 a
6: 2 c
7: 2 c
8: 2 b
9: 2 b
10: 2 c
11: 3 c
12: 3 a
13: 3 a
14: 3 a
15: 3 b

我想在每个ID组中替换字符“b”之前的字符“a”的整个序列,并希望将其替换为“b”。因此,条件是 如果“a”或序列“a”出现在“b” 之前, 替换所有“a”的。 (实际上,在我的实际表中,是在“b”前面带有“a”,“x”或“y”的情况下,应该替换前面的字符,但我应该能够概括一下)

在上面的示例中,应替换第3行中的“a”值(易于处理data.table中的(移位))以及第12-14行中的所有“a”(不确定如何做)。因此,所需的输出是这样的:
> dt
id values
1: 1 a
2: 1 c
3: 1 b
4: 1 b
5: 1 a
6: 2 c
7: 2 c
8: 2 b
9: 2 b
10: 2 c
11: 3 c
12: 3 b
13: 3 b
14: 3 b
15: 3 b

我想到的是从上一个索引开始循环,但是如果我有多个分组(例如,ID和DATE),我不确定如何处理,无论如何,这似乎不是最快的dt解决方案。

最佳答案

您可以使用rle()

注意:为避免歧义,我将"values"列重命名为"var",因为rle()函数还会生成一个包含名为"values"的向量的列表。

dt[, new := with(rle(var), rep(ifelse(values == "a" & c(values[-1], "") == "b", "b", values), lengths)), by = id]
dt

# id var new
# 1: 1 a a
# 2: 1 c c
# 3: 1 a b
# 4: 1 b b
# 5: 1 a a
# 6: 2 c c
# 7: 2 c c
# 8: 2 b b
# 9: 2 b b
# 10: 2 c c
# 11: 3 c c
# 12: 3 a b
# 13: 3 a b
# 14: 3 a b
# 15: 3 b b

关于根据前面的值按组替换值序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62287065/

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