gpt4 book ai didi

R:仅当键值相同并且键在连续行中重复时,如何对行中的值求和?

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

我有这个结构的以下数据表:

+-------------------+
| id | key | value |
+-----+-----+-------+
| 1 | A | 1000 |
| 1 | A | 2000 |
| 1 | B | 2001 |
| 1 | A | 2002 |
| 1 | A | 2004 |
| 2 | B | 2002 |
| 2 | C | 2002 |
+-------------------+

我的目标是按 id 和 key 对值求和,但不仅仅是按 id 和 key 分组,我只想对连续行的 id 和 key 对相同的值求和。

结果应该是:
+-------------------+
| id | key | value |
+-----+-----+-------+
| 1 | A | 3000 |
| 1 | B | 2001 |
| 1 | A | 4006 |
| 2 | B | 2002 |
| 2 | C | 2002 |
+-------------------+

有没有办法达到这个结果?

最佳答案

我们可以使用 rleid来自 data.table .

我们将“data.frame”转换为“data.table”。从“key”列创建另一个分组列“ind”。按 'id' 和 'ind' 分组,我们得到 sum 'value' 并获取 'key' 的第一个元素。我们可以将 'ind' 分配给 NULL,因为在预期的输出中不需要它。

library(data.table)
setDT(df1)[,list(value = sum(value), key=key[1L]),
by = .(ind=rleid(key), id)][, ind:=NULL][]
# id value key
#1: 1 3000 A
#2: 1 2001 B
#3: 1 4006 A
#4: 2 2002 B
#5: 2 2002 C

或者正如@Frank 建议的那样,我们可以在 rleid 中使用多列,将其作为分组变量,获取其他变量的第一个元素和 sum 'value',将不需要的列分配给 NULL避免复制。
setDT(df1)[, list(id=id[1L], key=key[1L], value=sum(value)) ,
by = .(r=rleid(id, key))][, r:= NULL][]
# id key value
#1: 1 A 3000
#2: 1 B 2001
#3: 1 A 4006
#4: 2 B 2002
#5: 2 C 2002

或者我们可以使用 dplyr .我们通过比较'key'的相邻元素来创建分组变量'ind',并得到 sum 'value' 和 first 'key' 的元素与 summarise .
library(dplyr)
df1 %>%
group_by(ind= cumsum(key!=lag(key, default=TRUE)), id) %>%
summarise(value=sum(value), key=first(key)) %>%
ungroup() %>%
select(-ind)
# id value key
#1 1 3000 A
#2 1 2001 B
#3 1 4006 A
#4 2 2002 B
#5 2 2002 C

注意:在 dplyr 中和 data.table我们还可以将“key”列作为分组变量并删除 key=key[1L]key=first(key)) .

或者我们 transform通过创建“ind”列并使用 aggregate 来创建数据集来自 base R得到预期的输出
df1 <- transform(df1, ind = cumsum(c(TRUE,head(key,-1)!=tail(key,-1))))
aggregate(value~., df1, FUN=sum)[-3]
# id key value
#1 1 A 3000
#2 1 B 2001
#3 1 A 4006
#4 2 B 2002
#5 2 C 2002

数据
df1 <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 2L, 2L), key = c("A", 
"A", "B", "A", "A", "B", "C"), value = c(1000L, 2000L, 2001L,
2002L, 2004L, 2002L, 2002L)), .Names = c("id", "key", "value"
), class = "data.frame", row.names = c(NA, -7L))

关于R:仅当键值相同并且键在连续行中重复时,如何对行中的值求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32308636/

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