r - 如何根据年份模式匹配面板数据?
问题描述
我想从对照池中选择个体作为治疗病例的对照。如果他们在一年中的活动/不活动与治疗的活动模式相匹配,则选择控制个体。
例如。一个治疗病例有: 2009 年、2011 年有活动,但 2010 年没有活动(因此没有当年的记录)。受治疗的对照组应仅由在 2009 年和 2011 年也有活动且在 2010 年没有活动的个人组成。
我只关注经过处理的活动模式中的 3 年区块。因此,从有活动的最大年份到 2 年前。
如果我对处理池和控制池有单独的 data.tables,我将如何匹配它们?
处理后的样子:
treated <- data.table(id = c(1, 1, 1, 2, 2, 3, 3, 4),
yr = c(2010, 2011, 2012, 2011, 2012, 2010, 2012, 2013))
id yr
1 2010
1 2011
1 2012
2 2011
2 2012
3 2010
3 2012
4 2013
控制
control <- data.table(id = c(rep(5, 6), rep(6, 3), 7, 7, 8, 8, 8),
yr = c(2009:2014, 2011, 2012, 2013, 2010, 2012, 2009, 2013, 2014))
id yr
5 2009
5 2010
5 2011
5 2012
5 2013
5 2014
6 2011
6 2012
6 2013
7 2010
7 2012
8 2009
8 2013
8 2014
我尝试将两者都放在宽格式中,以便可以在缺失的年份制作 NA,但无法弄清楚如何从那里匹配。
dcast(treated, id ~ yr, value.var = "yr")
id 2010 2011 2012 2013
-----------------------------------
1 2010 2011 2012 NA
2 NA 2011 2012 NA
3 2010 NA 2012 NA
4 NA NA NA 2013
因此,每个治疗的活动/不活动模式将是:
id pattern ===================== 1 2010 2011 2012 2 NA 2011 2012 3 2010 NA 2012 4 NA NA 2013
dcast(control, id ~ yr, value.var = "yr")
id 2009 2010 2011 2012 2013 2014
----------------------------------------------------
5 2009 2010 2011 2012 2013 2014
6 NA NA 2011 2012 2013 NA
7 NA 2010 NA 2012 NA NA
8 2009 NA NA NA 2013 2014
所以1
应该搭配 with 5
2
with 6
3
with 7
4
with8
谁能指出我正确的方向?
(不确定处理这个问题的最佳方法,但现在我有一个函数,它接受一个处理过的案例,为控制选择个体并计算效果。所以我会对与特定处理过的案例匹配的控制 ID 列表感到满意。然后我会使用这些 id 来对主控件 data.table 进行子集化。)
对于预期的输出,假设匹配方法在这个函数中:
get_control_ids <- function(treated_id){
...
return(vector_of_control_ids)
}
然后在id上运行这个函数1
get_control_ids(1)
将产生一个包含与其匹配的控件 ID 的向量。因此,使用我的微型控制池,该函数将返回一个仅包含5
.
编辑:我不确定输出应该是什么样子。所以任何关于这方面的提示也会很方便。也许一个 data.table 像:
treated_id control_ids
-----------------------------------
1 5, 10, 13
2 6, 22, 23
对于更多上下文,我有一个calculate_effects(treated_key)
以这种方式工作的函数:
我有 3 个 data.tables:
treated
- 每年的活动都有重复的 ID(加上其他列)
treated_keys
- 有唯一的 ID(在我的实际数据中,我有两列来识别特定的处理)
control
我像这样使用我的calculate_effects(treated_key)
功能:
results <- treated_keys[, calculate_effects(.SD), by = 1:nrow(treated_keys)]
在函数中,treated
使用treated_key
将提取属于该特定处理案例的所有记录的特定子集。
同样在函数内部,control
根据一些匹配规则进行子集化,然后用于计算。
我想在我的代码中添加代码calculate_effects(treated_key)
,它将正确选择该特定的控件treated_key
。
解决方案
假设每年有 3 个区块,您可以执行以下操作:
#expand treated to fill in gap years if any
exptrt <- treated[, .(yr=seq(max(yr)-2L, max(yr))), by=.(id)][,
att := 0L][
treated, att := 1, on=.(id, yr)]
#pivot control into id against yr
pctrl <- dcast(control, id ~ yr, length, value.var = "yr")
#for each id, pivot treated and join with control using
#whatever years are in treated incl gap years
exptrt[, cid := id]
exptrt[, {
ptrt <- dcast(.SD, cid ~ yr, value.var="att")
pctrl[ptrt, on=names(ptrt)[-1L], x.id]
}, by=.(id)]
输出:
id V1
1: 1 5
2: 2 6
3: 3 7
4: 4 8
推荐阅读
- azure-cosmosdb - 在 Azure 搜索中创建数据源时如何指定特定的 Azure Cosmos Db 区域副本
- ionic3 - 在执行 API 之前等待 Promise 中的值 - 错误:预期 1 个参数,但得到 0
- swift - 从 Vapor 3 中的作业访问服务
- sql - MS Access 对一行中的单列求和
- kotlin - 如何通过上下滑动重新排列我的 recyclerview 项目的顺序?
- google-cloud-platform - 在 AVRO 格式的 GCS 上的 BigQuery 中创建外部表时出现大小问题
- python - Cloud Storage 存储分区的 Cloud SQL 导入权限问题
- angular - 角。如何有条件地导入仅用于生产的 Kendo UI JQuery 文件
- scala - Spark Streaming - 写入 Kafka 主题
- ruby-on-rails - Rails Active Support Instrumentation Mongoid 数据库运行时