我有一个数据框:
DF <- data.frame(Observation = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17),
ID = c('A','A','B','C','D','D','B','B','B','B','A','A','A','B','D','D','C'),
Group = c('X1','X2','X1','X1','X2','X2','X2','X1','X1','X2','X2','X2','X2','X1','X2','X1','X1'),
Value = c(1,0,1,0,0,1,1,1,0,0,1,1,0,1,0,1,1))
我想通过“ ID”(不是复杂的)获取累积总和,但仅基于每个ID所属的“ Group”的各个最后值。换句话说:对于每个“ ID”,为存在ID的“组”的所有最后可用值创建累加和(可以在给定行中包含当前值,并给出最后可用值的引用)。>
详细说明:ID = A的示例:
在(1
中,ID
= A
在(X1
)中引用1
,其值= 1
,导致cum_sum = 1
。
在(2
= ID
中引用A
中的X1
,其值= 1
和{{1} }(1
中的} = = X2
,导致cum_sum = 2
。
在(0
= 1
中引用11
中的ID
,其值= A
和{{1} }(X1
中的} = = 1
,导致cum_sum = 1
。
在(X2
= 11
中引用1
中的2
,其值= 12
和{{1} }(ID
中的} = = A
,导致cum_sum = X1
。
在(1
= 1
中引用X2
中的12
,其值= 1
和{{1} }(2
中的} = = 13
,导致cum_sum = ID
。
最终结果如下所示。
A
非常感谢您。
答案 0 :(得分:3)
与其他人达成共识,解释有些难以理解...但这是我的尝试:您是说您要尝试计算每个ID和每个组的累积最后一个ID的总和价值吗?
如果是,这是一个实现。诀窍是计算每个ID和每个组的导数(例如diff()
),然后将每个ID取cumsum()
:
DF %>%
group_by(ID, Group) %>%
mutate(Diff = Value - lag(Value, default=0)) %>%
group_by(ID) %>%
mutate(Cum_Sum = cumsum(Diff))
答案 1 :(得分:1)
我同意评论中表达的观点,即不清楚。老实说(我并不是真的把这当作冒犯),这是一个糟糕的问题描述,带有不明确/非标准的术语(“引用”)和令人困惑的解释。
以下可能是寻求解决方案的步骤;它不能完全重现您的预期输出,但是已经接近了。希望您实际上在预期输出中犯了一个错误,因为坦率地说我无法弄清楚逻辑。
DF %>%
group_by(ID) %>%
mutate(
n = 1:n(),
Cum_Sum = if_else(n > 1, Value + first(Value), Value)) %>%
select(-n)
## A tibble: 17 x 5
## Groups: ID [4]
# Observation ID Group Value Cum_Sum
# <dbl> <fct> <fct> <dbl> <dbl>
# 1 1 A X1 1 1
# 2 2 A X2 0 1
# 3 3 B X1 1 1
# 4 4 C X1 0 0
# 5 5 D X2 0 0
# 6 6 D X2 1 1
# 7 7 B X2 1 2
# 8 8 B X1 1 2
# 9 9 B X1 0 1
#10 10 B X2 0 1
#11 11 A X2 1 2
#12 12 A X2 1 2
#13 13 A X2 0 1
#14 14 B X1 1 2
#15 15 D X2 0 0
#16 16 D X1 1 1
#17 17 C X1 1 1
我将您的问题陈述翻译为:Cum_Sum
是当前Value
和该Group
中 first 值的总和;如果当前值为第一个值,则Cum_Sum
就是当前的Value
。
前9行与您的预期输出相同;我不知道为什么第10行的Cum_Sum
是0 ...
希望渐近您想要做的事情
DF %>%
group_by(ID) %>%
mutate(Cum_Sum = Value + lag(Value, default = 0))
## A tibble: 17 x 5
## Groups: ID [4]
# Observation ID Group Value Cum_Sum
# <dbl> <fct> <fct> <dbl> <dbl>
# 1 1 A X1 1 1
# 2 2 A X2 0 1
# 3 3 B X1 1 1
# 4 4 C X1 0 0
# 5 5 D X2 0 0
# 6 6 D X2 1 1
# 7 7 B X2 1 2
# 8 8 B X1 1 2
# 9 9 B X1 0 1
#10 10 B X2 0 0
#11 11 A X2 1 1
#12 12 A X2 1 2
#13 13 A X2 0 1
#14 14 B X1 1 1
#15 15 D X2 0 1
#16 16 D X1 1 1
#17 17 C X1 1 1
假设我正确理解了您的“逻辑”,那么这与累积和无关。相反,这只是
每个ID
。
如果您希望按照ID
和Group
进行此操作,只需将group_by(ID)
替换为group_by(ID, Group)
。