【发布时间】:2019-09-29 17:08:22
【问题描述】:
我有一个看起来像这样的数据集
df <- data.frame("id" = c("Alpha", "Alpha", "Alpha","Alpha","Beta","Beta","Beta","Beta"),
"Year" = c(1970,1971,1972,1973,1974,1977,1978,1990),
"Group" = c(1,NA,1,NA,NA,2,2,NA),
"Val" = c(2,3,3,5,2,5,3,5))
我想创建一个“Val”的累积和。我知道怎么做简单的累积和
df <- df %>% group_by(id) %>% mutate(cumval=cumsum(Val))
但是,我希望我的最终数据看起来像这样
final <- data.frame("id" = c("Alpha", "Alpha", "Alpha","Alpha","Beta","Beta","Beta","Beta"),
"Year" = c(1970,1971,1972,1973,1974,1977,1978,1990),
"Group" = c(1,NA,1,NA,NA,2,2,NA),
"Val" = c(2,3,3,5,2,5,3,5),
"cumval" = c(2,5,6,11,2,7,5,10))
基本思想是,当两个“Val”属于同一个“组”时,稍后(年份)发生的一个替换前一个。 例如,在样本数据集中,观察 3 的“cumval”为 6 而不是 8,因为 1972 年的“Val”取代了 1970 年的“Val”。Beta 也是如此。
提前感谢您的帮助
【问题讨论】:
-
类似
df %>% group_by(id) %>% mutate(cumval = cumsum(replace(Val, duplicated(Val), first(Val)))) -
因为 1972 年 (3) 时的 val 与 1970 年 (2) 时的 val 一样是“组”1。基本上,对于同一组内的 val,后一个值代替前一个值。因此这里 val 1972 代替了 val 1970(并与 val 1971 相加),这是一个不同的组(NA)
-
确定:obs 1: cumval = val =2, obs 2: cumval = val(obs1) + val(obs2) =2+3=5, obs 3: cumval = val (obs2) + val(obs3) = 3+3 = 6... etc..这个想法是因为 obs 1 和 3 属于同一组,id obs 3 代替 obs 1
-
好的,我尝试了几件事,但“Beta”部分仍然不匹配
-
那是不幸的!感谢您无论如何都尝试了一些东西..
标签: r conditional-statements data-manipulation cumulative-sum