在data.frame中更新或添加聚合值
假设我有以下简单的在data.frame中更新或添加聚合值,r,cumsum,R,Cumsum,假设我有以下简单的data.frame: ID value 1 1 3 2 2 4 3 1 5 4 3 3 下面是我想要的输出,我们向cumsum添加值,或者根据已经使用的ID的最新值更新它 ID value cumsum 1 1 3 3 2 2 4 7 3 1 5 9 4 3 3 12 在第3行中,新的值形成一个更新的总和(7
data.frame
:
ID value
1 1 3
2 2 4
3 1 5
4 3 3
下面是我想要的输出,我们向cumsum
添加值
,或者根据已经使用的ID
的最新值更新它
ID value cumsum
1 1 3 3
2 2 4 7
3 1 5 9
4 3 3 12
在第3行中,新的值
形成一个更新的总和
(7-3+5=9)
。第4行将一个新的值添加到cumsum
,因为ID
在(4+5+3=12)
之前没有使用过,这将为您的示例生成所需的结果:
df<-read.table(header=T, text="ID value
1 1 3
2 2 4
3 1 5
4 3 3")
library(tidyverse)
df %>%
group_by(ID) %>%
mutate(value = value-lag(value, def = 0L)) %>%
ungroup %>% mutate(cumsum = cumsum(value))
# # A tibble: 4 x 3
# ID value cumsum
# <int> <int> <int>
# 1 1 3 3
# 2 2 4 7
# 3 1 2 9
# 4 3 3 12
df%
分组依据(ID)%>%
突变(值=值滞后(值,def=0L))%>%
解组%>%变异(总和=总和(值))
##tibble:4 x 3
#ID值总和
#
# 1 1 3 3
# 2 2 4 7
# 3 1 2 9
# 4 3 3 12
我使用了数据。表用于cumsum
。计算累积平均值有点棘手,因为仅仅使用cummean
并不能调整观测值的数量
library(data.table)
dt = data.table(id = c(1, 2, 1, 3), value = c(3, 4, 5, 3))
dt[, tmp := value-shift(value, n = 1L, type = "lag", fill = 0), by = c("id")]
#CUMSUM
dt[, cumsum := cumsum(tmp)]
#CUMMEAN WITH UPDATED N
dt[value != tmp, skip := 1:.N]
dt[, skip := na.locf(skip, na.rm = FALSE)]
dt[is.na(skip), skip := 0]
dt[, cummean := cumsum(tmp)/(seq_along(tmp)-skip)]
输出为:
id value tmp cumsum skip cummean
1: 1 3 3 3 0 3.0
2: 2 4 4 7 0 3.5
3: 1 5 2 9 1 4.5
4: 3 3 3 12 1 4.0
编辑:将lag
功能更改为数据。表的shift
功能。工作正常,谢谢!有没有办法让它也能与cummean
一起使用?似乎n没有更新。@Stefan您可以添加一个包含输入、代码和预期输出的示例吗?