簡體   English   中英

R data.table 有條件地按組聚合行

[英]R data.table Aggregating rows by group conditionally

我目前正在 R 中的 data.table 中使用以下數據集:

    id   age_start   age_end    cases
    1    2           2          1000          
    1    3           3          500           
    1    4           4          300           
    1    2           4          1800            
    2    2           2          8000          
    2    3           3          200           
    2    4           4          100           
  • 在給定的數據集中,我只想要age_start == 2 和age_end ==4 的情況的值。
  • 在age_start !=2 和age_end !=4 的每個ID 中,我需要對行進行求和或聚合以創建一組age_start==2 和age_end ==4。 在這些情況下,我需要將 age_start==2 & age_end==2、age_start==3 & age_end==3 以及 age_start==4 & age_end==4 的情況匯總到一個新行中age_start==2 和 age_end==4。
  • 在將這些匯總為一行之后,我想刪除我用來制作新 age_start==2 和 age_start==4 行的行(即年齡值 2-2、3-3 和 4-4)因為不再需要它們

理想情況下,當我完成這些步驟時,數據集將如下所示:

    id   age_start   age_end    cases
    1    2           4          1800          
    2    2           4          8300

非常感謝有關如何在 data.table 中完成此操作的任何建議!

我們可以指定i用的邏輯條件,分組by “ID”,得到sum的“案件”,同時增加“age_start”,“age_end”為2和4

library(data.table)
as.data.table(df1)[age_start != 2|age_end != 4, 
     .(age_start = 2, age_end = 4, cases = sum(cases)), id]
#  id age_start age_end cases
#1:  1         2       4  1800
#2:  2         2       4  8300

數據

df1 <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), age_start = c(2L, 
3L, 4L, 2L, 2L, 3L, 4L), age_end = c(2L, 3L, 4L, 4L, 2L, 3L, 
4L), cases = c(1000L, 500L, 300L, 1800L, 8000L, 200L, 100L)), 
  class = "data.frame", row.names = c(NA, 
-7L))

您可以對第一個項目符號使用 equi-join; 和第二個非對等連接:

m_equi = x[.(id = unique(id), age_dn = 2, age_up = 4), 
  on=.(id, age_start = age_dn, age_end = age_up),
  nomatch=0
]

m_nonequi = x[!m_equi, on=.(id)][.(id = unique(id), age_dn = 2, age_up = 4), 
  on=.(id, age_start >= age_dn, age_end <= age_up), 
  .(cases = sum(cases)), by=.EACHI
]

res = rbind(m_equi, m_nonequi)

   id age_start age_end cases
1:  1         2       4  1800
2:  2         2       4  8300

這個怎么運作:

  • x[i]的用途值i來查找的行和列在x根據在指定的規則on=

  • nomatch=0表示x[i]中不匹配的i行被刪除,因此m_equi僅以 id=1 結束。

  • x[!m_equi, on=.(id)]是一個跳過 id=1 的反連接,因為我們已經在 equi 連接中匹配了它。

  • by=.EACHIx[i]i的每一行進行分組,以便進行聚合。

另一種方法是在開始 2 和結束 4 的行上反連接,以便所有組都需要聚合(類似於@akrun 的答案),盡管我猜這會降低效率。

暫無
暫無

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

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