Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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 最大化唯一匹配对而不重复条目_R - Fatal编程技术网

R 最大化唯一匹配对而不重复条目

R 最大化唯一匹配对而不重复条目,r,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, 9

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

    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中做到这一点,将不胜感激

假设您知道如何将数据获取到R对象中,并且数据帧(或强制为数据帧的矩阵)被命名为
dat
。然后试试这个:

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

可能有一个tidyverse等价于do.call(rbind,…),但我并不精通(tidy)这一点。

这可能超出了堆栈溢出答案的范围,无法完全涵盖,但我认为你所做的类似于“倾向评分匹配”(医学研究中使用的一个术语),还有一些R软件包进行倾向匹配。嗨,马吕斯。这正是我正在做的。不幸的是,我发现的R包只匹配1个确切标准,我必须匹配2个(年份和sic代码-此处未显示)。@HollyL似乎您可能不需要匹配年份,您可以将数据拆分为年份,并对每个年份执行单独的匹配过程。这可能会使使用现有软件包变得更容易。这应该是该数据的正确答案吗?如果是的话,你能解释一下如何一步一步地实现吗?(很难理解“公司”是什么意思,以及“配对”应该扮演什么角色。)如果不是,那么用正确的答案举例说明。你真的应该有一年以上的时间,这样就可以对分组方面进行测试。@42-我想我现在已经列出了在R中复制的代码。很抱歉这里的混乱。我正在尝试创建尽可能多的1:1匹配对,因为根据倾向评分(pscoredif)确定了可能的对。gvkey_treat是指在给定年份内收到治疗效果的公司,gvkey.control是指未收到治疗效果的公司。我想确保gvkey_treat和gvkey.control在给定的年份对中只出现一次。
library(tidyverse)
 small.dat <- do.call(rbind,
                      dat %>% group_by(dat[1:3]) %>%
                              filter(which.min(.$pscoredif)
                      )