最大化唯一匹配对,而无需重复输入

时间:2019-12-20 00:31:38

标签: r

我有一对公司的数据集,如下所示:

    structure(list(year = c(2000, 2000, 2000, 2000, 2000, 2000, 2000, 
2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2001, 2001, 2001, 
2001, 2001), gvkey_treat = c(212340, 7435, 6008, 6008, 6008, 
6008, 5169, 5169, 5169, 5169, 9850, 14477, 12142, 12142, 12142, 
14590, 14590, 14590, 7912, 7912), gvkey.control = c(3170, 3170, 
1632, 24800, 10115, 12389, 1632, 24800, 10115, 12389, 2146, 2146, 
114524, 5074, 1891, 6403, 11228, 1661, 6403, 11228), pscoredif = c(0.00834195600000004, 
0.007494632, 0.00505072699999998, 0.00736360899999999, 0.00615869899999999, 
0.00785061100000001, 0.015638134, 0.013325252, 0.014530162, 0.01283825, 
0.00707618099999996, 0.000622760999999972, 2.63809999999642e-05, 
0.016737042, 0.00582589899999997, 0.004946012, 0.00147647300000003, 
0.002811854, 0.00478919899999997, 0.00131966)), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))

我有给定年份中配对的公司列表。我需要以这样一种方式减少清单,即一家公司每年只出现一次,只有一次受到控制,而同时又保留了尽可能多的公司。其次,如果有多个选项,我想使配对对具有最小的pscoredif值。

year gvkey_treat gvkey.control pscoredif
2000    7435    3170    0.007494632
2000    6008    1632    0.005050727
2000    5169    24800   0.013325252
2000    9850    2146    0.007076181
2000    12142   114524  0.000026381
2001    14590   11228   0.001476473
2001    7912    6403    0.004789199

如果有人可以帮助解释如何用R做到这一点,将不胜感激!

1 个答案:

答案 0 :(得分:1)

让我们假设您知道如何将数据获取到R个对象中,并且数据框(或强制转换为数据框的矩阵)的名称为dat。然后尝试:

  small.dat <- do.call(rbind, 
                       lapply( split(dat, dat[1:3]) , 
                              function(d) d[which.min(d$pscoredif), ,drop=FALSE]
                       )      )

在没有MCVE的情况下未经测试,但是lapply(split(...,...))内部部分的目的是在列表结构中将大型数据对象拆分为许多较小的对象,然后在每个对象中选择满足条件的一行您的选择标准。最后,rbind过程将使用yeargvkey_treatgvkey.control的每个唯一组合中的一个来重新制作较小的对象。

我确信您可以使用tidyverse的lapply(split(...))group_by操作来完成与filter类似的操作。也许甚至是这样:

library(tidyverse)
 small.dat <- do.call(rbind,
                      dat %>% group_by(dat[1:3]) %>%
                              filter(which.min(.$pscoredif)
                      )

可能有do.call(rbind, ...)的整洁形式,但我对此并不精通。