簡體   English   中英

如何按組對時間序列數據行求和?

[英]How to sum time-series data rows by group?

我的數據集如下所示:

block <- c(1,1,2,2,3,3,4,4)
treatment <- c(1,1,2,2,1,1,2,2)
type <- c("adult1","adult2","adult1","adult2","adult1","adult2","adult1","adult2")
t1 <- c(1,1,2,2,3,3,4,4)
t2 <- c(1,1,2,2,3,3,4,4)
t100 <- c(1,1,2,2,3,3,4,4)
df <- data.frame(block,treatment, type,t1,t2,t100)

我只希望針對塊對每個時間點(t1,t2,t100)的成年人求和。 這是我希望最終輸出像

block <- c(1,2,3,4)
treatment <- c(1,2,1,2)
type <- c("adult","adult","adult","adult")
t1 <- c(2,4,6,8)
t2 <- c(2,4,6,8)
t100 <- c(2,4,6,8)
df <- data.frame(block,treatment,type,t1,t2,t100

這是我嘗試使用聚合函數:

aggregate(df[,3:5], by = list(df$block), FUN = sum)

我收到一條錯誤消息,指出“參數必須具有相同的長度”。

使用aggregate您可以使用公式來總結t1:t100並按blocktreatment block

df_final = aggregate(cbind(t1, t2, t100) ~ block + treatment, data = df, sum)
df_final$type1 = "adult"

結果:

  block treatment t1 t2 t100 type1
1     1         1  2  2    2 adult
2     3         1  6  6    6 adult
3     2         2  4  4    4 adult
4     4         2  8  8    8 adult

或者,您可以使用dplyr進行此dplyr

library(dplyr)

df %>%
  group_by(block, treatment) %>%
  summarize_at(vars(t1:t100), sum) %>%
  mutate(type1 = "adult")

要么

df %>%
  group_by(block, treatment) %>%
  summarize_at(vars(2:4), sum) %>%
  mutate(type1 = "adult")

結果:

# A tibble: 4 x 6
# Groups:   block [4]
  block treatment    t1    t2  t100 type1
  <dbl>     <dbl> <dbl> <dbl> <dbl> <chr>
1     1         1     2     2     2 adult
2     2         2     4     4     4 adult
3     3         1     6     6     6 adult
4     4         2     8     8     8 adult

您還可以使用data.table ,它支持列索引:

library(data.table)

setDT(df)[, lapply(.SD, sum), by=.(block, treatment), .SDcols=4:6]

結果:

   block treatment t1 t2 t100
1:     1         1  2  2    2
2:     2         2  4  4    4
3:     3         1  6  6    6
4:     4         2  8  8    8

基礎R中的解決方案:

df <- cbind.data.frame(
    aggregate(cbind(t1, t2, t100) ~ block + treatment, data = df, FUN = sum),
    type = "adult");
#  block treatment t1 t2 t100  type
#1     1         1  2  2    2 adult
#2     3         1  6  6    6 adult
#3     2         2  4  4    4 adult
#4     4         2  8  8    8 adult

注意:此處的關鍵是cbind相關列。


基准比較

下面是從結果microbenchmark所有三種溶液(基R, dplyrdata.table )。

# Sample dataframe with 1000 rows
df <- cbind.data.frame(
    block = rep(seq(1, 1000), each = 2),
    treatment = rep(c(1, 1, 2, 2), length.out = 250),
    type = rep(c("adult1", "adult2"), length.out = 500),
    t1 = rep(seq(1, 1000), each = 2),
    t2 = rep(seq(1, 1000), each = 2),
    t100 = rep(seq(1, 1000), each = 2));


# Benchmarking results
require(microbenchmark);
require(dplyr);
require(magrittr);
require(data.table);
microbenchmark(
    baseR = cbind.data.frame(
        aggregate(cbind(t1, t2, t100) ~ block + treatment, data = df, FUN = sum),
        type = "adult"),
    dplyr = df %>%
        group_by(block, treatment) %>%
        summarize_at(vars(t1:t100), sum) %>%
        mutate(type1 = "adult"),
    datatable = setDT(df)[, lapply(.SD, sum), by=.(block, treatment), .SDcols=4:6]
)
#Unit: microseconds
#      expr       min         lq       mean     median        uq       max neval
#     baseR 13817.627 14040.4835 14931.4202 14278.8220 15026.413 42347.511   100
#     dplyr  6698.983  7076.6360  8459.7861  7240.1680  7486.245 73401.747   100
# datatable   463.837   500.6555   663.5425   576.3075   597.443  9015.664   100

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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