我想在给定列中为两个其他列的每个唯一组合求和一个值:
例如,我想转换以下数据框:
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
循环会做我想要的 - 但我现在完全失去了 - 任何和所有帮助都赞赏...
答案 0 :(得分:4)
在基础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
答案 1 :(得分:3)
建议尝试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
答案 2 :(得分:0)
实际上,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")]
您的实际示例似乎只为每个唯一的周求和,在这种情况下,删除&#34; Day&#34;来自&#34; by&#34;。