[英]Sum a rows within a column for each unique combination r
我想在给定列中为两个其他列的每个唯一组合求和一个值:
例如,我想从以下数据框转换:
Week Day Value
1 1 1
1 2 3
1 3 4
2 1 2
2 2 2
2 3 3
至:
Week Day Value Sum
1 1 1 1
1 2 3 4
1 3 4 8
2 1 2 2
2 2 2 4
2 3 3 7
我认为for
循环会做我想要的 - 但我在这一点上完全迷失了 - 任何和所有帮助都赞赏...
在基数R中,您可以使用ave()
:
x <- read.table(header=T, text="
Week Day Value
1 1 1
1 2 3
1 3 4
2 1 2
2 2 2
2 3 3
")
x$Sum <- ave(x$Value, x$Week, FUN=cumsum)
> x
Week Day Value Sum
1 1 1 1 1
2 1 2 3 4
3 1 3 4 8
4 2 1 2 2
5 2 2 2 4
6 2 3 3 7
建议尝试dplyr
。 相当于数据操作的主力。 从所需的输出,您似乎尝试根据周获得累积总和。
df = read.table(text="Week Day Value
1 1 1
1 2 3
1 3 4
2 1 2
2 2 2
2 3 3", header=T)
library(dplyr)
df %>% group_by(Week) %>% mutate(Sum = cumsum(Value))
# you get
Source: local data frame [6 x 4]
Groups: Week
Week Day Value Sum
1 1 1 1 1
2 1 2 3 4
3 1 3 4 8
4 2 1 2 2
5 2 2 2 4
6 2 3 3 7
或者您可以尝试data.table
,这是另一种适用于较大尺寸数据的工具。 快速且内存高效。
setDT(df)[, Sum := cumsum(Value), by = Week][]
Week Day Value Sum
1: 1 1 1 1
2: 1 2 3 4
3: 1 3 4 8
4: 2 1 2 2
5: 2 2 2 4
6: 2 3 3 7
实际上,for循环可能是一种看待它的坏方法 - 它们在数据帧上效率不高。 相反,我建议data.table :
#Turn into a data.table.
dt <- data.table(df)
#Sum, for each unique combination
dt <- dt[, j = list(value_sum = sum(Value)), by = c("Week","Day")]
您的实际示例似乎只是每个唯一周的总和,在这种情况下,从“by”中删除“Day”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.