簡體   English   中英

對每個唯一組合r的列中的行求和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM