R data.table按组有条件地聚合行
我目前正在R中的data.table中使用以下数据集:R data.table按组有条件地聚合行,r,data.table,R,Data.table,我目前正在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
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的情况的值。
在每个ID中,年龄从哪里开始=2和时代结束=4,我需要对行进行求和或聚合,以创建一组age\u start==2和age\u end==4。在这些情况下,我需要将age\u start==2和age\u end==2、age\u start==3和age\u end==3以及age\u start==4和age\u end==4的情况汇总到一个新的age\u start==2和age\u end==4行中。
在将这些数据汇总到一行之后,我想删除用于使新的age_start==2和age_start==4行的行,即不再需要的age值2-2、3-3和4-4
理想情况下,当我完成以下步骤时,数据集将如下所示:
id age_start age_end cases
1 2 4 1800
2 2 4 8300
对于如何在data.table中实现这一点的任何建议,我们将不胜感激 我们可以使用逻辑条件指定i,按“id”分组,在将“age\u start”、“age\u end”添加为2和4的同时获取“cases”的总和
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
数据
我们可以使用逻辑条件指定i,按“id”分组,在将“age\u start”、“age\u end”添加为2和4的同时获取“cases”的总和
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
数据
可以对第一个项目符号使用等联接;第二个为非等联接:
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中的值根据on=中指定的规则查找x中的行和列
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的答案那样进行聚合,尽管我认为这样效率较低。您可以对第一个项目符号使用等连接;第二个为非等联接:
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中的值根据on=中指定的规则查找x中的行和列
nomatch=0意味着删除x[i]中不匹配的i行,因此m_equi只以id=1结束
x[!m_equi,on=.id]是一个跳过id=1的反连接,因为我们已经在equi连接中匹配了它
by=.EACHI按x[i]中i的每一行分组,以便进行聚合
另一种方法是在具有start 2和end 4的行上进行反连接,这样所有组都需要像@akrun的答案那样进行聚合,尽管我认为这样效率较低