我有一对公司的数据集,如下所示:
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做到这一点,将不胜感激!
答案 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
过程将使用year
,gvkey_treat
和gvkey.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, ...)
的整洁形式,但我对此并不精通。