gpt4 book ai didi

r - 在R中: how to sum a variable by group between two dates

转载 作者:行者123 更新时间:2023-12-02 20:46:13 24 4
gpt4 key购买 nike

我有两个数据框(DF1 和 DF2):

(1) DF1 包含个体级别的信息,即 11 年(2000-2011)期间嵌套在 30 个单元中的 10,000 个人的信息。它包含四个变量:

  1. “个人”(每个人的数字 ID;范围为 1-10.000)
  2. “单元”(每个单元的数字 ID;范围为 1-30)
  3. “date1”(日期格式的日期,即2000-01-01等;范围从2000-01-01到2010-12-31)
  4. “日期2”(“日期1”+ 1 年)

(2) DF2 包含单位级别的信息,即同一时间段(2000-2011)内与 DF1 相同的 30 个单位的信息,并进一步包含一个数字变量(“x” ):

  1. “单元”(每个单元的数字 ID;范围为 1-30)
  2. “date”(日期格式的日期,即2000-01-01等;范围从2000-01-01到2011-12-31)
  3. “x”(数字变量,范围从 0 到 200)

我想创建新变量(“newvar”),为每个“单位”的每个“个体”提供从“date1”(DF1)到“date2”(DF2)计数的“x”(DF2)的总和)。这意味着我想将这个新变量添加到 DF1。

例如,如果“unit”=1中的“individual”=1,则“date1”=2000-01-01和“date2”=2001-01-01,并且在DF2中“unit”=1有三个观察值在时间段“date1”到“date2”(即2000-01-01到2001-01-01)中“x”=1,“x”=2和“x”=3,那么我想添加一个新变量,在“unit”=1“newvar”=6中给出“individual”=1。

我假设我需要在 R 中使用 for 循环并且一直在使用以下代码:

for(i in length(DF1)){

DF1$newvar[i] <-sum(DF2$x[which(DF1$date == DF1$date1[i] &
DF1$date == DF1P$date1[i] &
DF2$unit == DF1P$unit[i]),])

}

但收到错误消息:

Error in DF2$x[which(DF2$date ==  : incorrect number of dimensions 

任何有关如何创建此变量的想法将不胜感激!

这是一个小示例以及预期输出,为了简单起见,使用一个单位:

假设 DF1 如下所示:

individual  unit  date1        date2   
1 1 2000-01-01 2001-01-01
2 1 2000-02-02 2001-02-02
3 1 2000-03-03 2000-03-03
4 1 2000-04-04 2000-04-04
5 1 2000-12-31 2001-12-31
(...)
996 1 2010-01-01 2011-01-01
997 1 2010-02-15 2011-02-15
998 1 2010-03-05 2011-03-05
999 1 2010-04-10 2011-04-10
1000 1 2010-12-27 2011-12-27
1001 2 2000-01-01 2001-01-01
1002 2 2000-02-02 2001-02-02
1003 2 2000-03-03 2000-03-03
1004 2 2000-04-04 2000-04-04
1005 2 2000-12-31 2001-12-31
(...)
1996 2 2010-01-01 2011-01-01
1997 2 2010-02-15 2011-02-15
1998 2 2010-03-05 2011-03-05
1999 2 2010-04-10 2011-04-10
2000 2 2010-12-027 2011-12-27
(...)
3000 34 2000-02-02 2002-02-02
3001 34 2000-05-05 2001-05-05
3002 34 2000-06-06 2001-06-06
3003 34 2000-07-07 2001-07-07
3004 34 2000-11-11 2001-11-11
(...)
9996 34 2010-02-06 2011-02-06
9997 34 2010-05-05 2011-05-05
9998 34 2010-09-09 2011-09-09
9999 34 2010-09-25 2011-09-25
10000 34 2010-10-15 2011-10-15

假设 DF2 如下所示:

unit      date         x
1 2000-01-01 1
1 2000-05-01 2
1 2000-12-01 3
1 2001-01-02 10
1 2001-07-05 20
1 2001-12-31 30
(...)
2 2010-05-05 1
2 2010-07-01 1
2 2010-08-09 1
3 (...)

这就是我希望 DF1 在运行代码后的样子:

individual  unit      date1        date2        newvar  
1 1 2000-01-01 2001-01-01 6
2 1 2000-02-02 2001-02-02 16
3 1 2000-03-03 2001-03-03 15
4 1 2000-04-04 2001-04-04 15
5 1 2000-12-31 2001-12-31 60
(...)
996 1 2010-01-01 2011-01-01 3
997 1 2010-02-15 2011-02-15 2
998 1 2010-03-05 2011-03-05 2
999 1 2010-04-10 2011-04-10 2
1000 1 2010-12-27 2011-12-27 0
(...)

但是,我不能简单地进行汇总:想象一下,在 DF1 中,每个“单元”在 2000 年至 2011 年间每年都有数百个个体。而 DF2 在 2000 年至 2011 年间对每个单元都有许多观察结果。

最佳答案

我们可以使用data.table

library(data.table)
setDT(DF1)
setDT(DF2)
DF1[DF2[, .(newvar = sum(x)), .(unit, individual = cumsum(date %in% DF1$date1))],
newvar := newvar, on = .(individual, unit)]
DF1
# individual unit date1 date2 newvar
#1: 1 1 2000-01-01 2001-01-01 6
#2: 2 1 2001-01-02 2002-01-02 60

或者我们可以使用非等值连接

DF1[DF2[DF1, sum(x), on = .(unit, date >= date1, date <= date2),
by = .EACHI], newvar := V1, on = .(unit, date1=date)]

DF1
# individual unit date1 date2 newvar
#1: 1 1 2000-01-01 2001-01-01 6
#2: 2 1 2001-01-02 2002-01-02 60

关于r - 在R中: how to sum a variable by group between two dates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44345651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com