[英]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
理想情況下,當我完成這些步驟時,數據集將如下所示:
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=.EACHI
按x[i]
中i
的每一行進行分組,以便進行聚合。
另一種方法是在開始 2 和結束 4 的行上反連接,以便所有組都需要聚合(類似於@akrun 的答案),盡管我猜這會降低效率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.