Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R data.table按组有条件地聚合行_R_Data.table - Fatal编程技术网

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

我目前正在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的情况的值。 在每个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的答案那样进行聚合,尽管我认为这样效率较低