对每个唯一组合r的列中的行求和

时间:2014-11-25 21:36:22

标签: 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循环会做我想要的 - 但我现在完全失去了 - 任何和所有帮助都赞赏...

3 个答案:

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