gpt4 book ai didi

r - 仅聚合 data.table 中的连续行

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

我有一个包含大约 30 列和 1 亿行的 data.table。数据包含多个行块,其中块中的每一行在我感兴趣的三个特定列中具有相同的值。 这是一个说明性示例,其中我感兴趣的列是时间、水果和颜色:

dt <- data.table(Time = c(100, rep(101, 4), rep(102, 2), 103:105), 
Ref = 1:10,
Fruit = c(rep('banana', 2), 'apple', rep('banana', 2),
rep('orange', 2), 'banana', rep('apple', 2)),
Colour = c('green', 'yellow', 'red', rep('yellow', 2),
rep('blue', 2), 'red', 'green', 'red'),
Price = c(rep(1, 3), 2, 4, 3, 1, rep(5, 3)))
dt

# Time Ref Fruit Colour Price
# 1: 100 1 banana green 1
# 2: 101 2 banana yellow 1
# 3: 101 3 apple red 1
# 4: 101 4 banana yellow 2
# 5: 101 5 banana yellow 4
# 6: 102 6 orange blue 3
# 7: 102 7 orange blue 1
# 8: 103 8 banana red 5
# 9: 104 9 apple green 5
#10: 105 10 apple red 5

此示例包含两个块。第一个包含 101-banana-yellow第 4 行和第 5 行,第二行包含 102-orange-blue第 6 行和第 7 行。请注意,尽管第 2 行在时间、水果和颜色上与第 4 行和第 5 行匹配,但我不想将其作为块的一部分,因为第 3 行与第 2、4 和 5 行不同,并且打破连续的匹配行链。

一旦我找到了这些块,我想以这样的方式组合块,对于大多数列,只保留块中最后一行的值,而对于其他列,我想总结所有行中的值。在这个例子中,Ref 应该显示最后一个值,而 Price 应该总结,所以我想要的输出是:
#    Time Ref  Fruit Colour Price
# 1: 100 1 banana green 1
# 2: 101 2 banana yellow 1
# 3: 101 3 apple red 1
# 4: 101 5 banana yellow 6
# 5: 102 7 orange blue 4
# 6: 103 8 banana red 5
# 7: 104 9 apple green 5
# 8: 105 10 apple red 5

我试着用 data.table 的 by 来做这件事功能,但我无法获得所需的输出:
byMethod <- dt[, list(Ref = tail(Ref, 1), Price = sum(Price)), by = list(Time, Fruit, Colour)]
setcolorder(byMethod, c('Time', 'Ref', 'Fruit', 'Colour', 'Price'))
byMethod

# Time Ref Fruit Colour Price
# 1: 100 1 banana green 1
# 2: 101 5 banana yellow 7
# 3: 101 3 apple red 1
# 4: 102 7 orange blue 4
# 5: 103 8 banana red 5
# 6: 104 9 apple green 5
# 7 : 105 10 apple red 5

这适用于 102-orange-blue在示例中阻止,但它不会为 101-banana-yellow 产生我想要的结果块,因为它在我不想时包含此块中的第 2 行。

有人可以帮我从这里出去吗?

最佳答案

这速度够快吗?

#create an index
dt[,i:=.I]
#group adjacent indices together
dt[, g:=cumsum(c(1, (diff(i) > 1))), by=list(Time, Fruit, Colour)]
#sum prices
dt[, list(Ref=tail(Ref, 1), Price=sum(Price)),
by=list(Time, Fruit, Colour, g)]

# Time Fruit Colour g Ref Price
# 1: 100 banana green 1 1 1
# 2: 101 banana yellow 1 2 1
# 3: 101 apple red 1 3 1
# 4: 101 banana yellow 2 5 6
# 5: 102 orange blue 1 7 4
# 6: 103 banana red 1 8 5
# 7: 104 apple green 1 9 5
# 8: 105 apple red 1 10 5

关于r - 仅聚合 data.table 中的连续行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21511257/

25 4 0