基于子组

时间:2019-04-17 08:37:08

标签: r dataframe

我有一个数据框:

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

非常感谢您。

2 个答案:

答案 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

假设我正确理解了您的“逻辑”,那么这与累积和无关。相反,这只是

enter image description here

每个ID

如果您希望按照IDGroup进行此操作,只需将group_by(ID)替换为group_by(ID, Group)