基于 R 中某些变量的相似值构造一个伪面板

construct a pseudo panel based on similar values for some variables in R

我有两个问题合二为一。我有 20 个数据框。每个人都受特定年份(从 2000 年到 2020 年)的限制。它们都有相同的列。 1)我想根据对变量列表(列)的类似观察来合并它们,这样我就可以构建一个面板。 2)加上合并时我想通过添加一个表示日期的后缀来重命名列。 例如,取 3 个数据帧

df1

year_sample   birth_date    country    work_establishment   Wage      
   2014          1995        US            X2134            1700       
   2014          1996        US            X26              1232       
   2014          1992        CANADA        X26              2553      
   2014          1990        FRANCE        X4T346           6574      
   2014          1983        BELGIUM       X2E43            1706       
   2014          1975        US            X2134            1000      
   2014          1969        CHINA         XXZT55           996       

df2

year_sample   birth_date    country    work_establishment   Wage      
   2015          1995        US            X2134            1756       
   2015          1996        US            X26              1230       
   2015          1992        CANADA        X26              2700       
   2015          1990        FRANCE        X4T346           6574       
   2015          1975        US            X2134            1000       
   2015          1979        GERMANY       X35555           2435      

df3

year_sample   birth_date    country    work_establishment   Wage      
   2016          1995        US            X2134            1750       
   2016          1996        US            X26              1032       
   2016          1992        CANADA        X26              2353       
   2016          1990        FRANCE        X4T346           6574        
   2016          1955        MALI          X2244            1000       
   2016          1979        GERMANY       X35555           2435  

如果一个观察值对 c(birth_date; country ; work_establisment) 具有相似的值,那么我会将其视为同一个人。因此我要:

df_final

 id   birth_date    country    work_establishment   Wage_2014      Wage_2015  Wage_2016 
  1   1995           US            X2134            1700           1756        1750
  2   1996           US            X26              1232           1230        1032
  3   1992           CANADA        X26              2553           2700        2353
  4   1990           FRANCE        X4T346           6574           6574        6574

我知道如果我只有两个数据帧我可以做到:

df_final <- transform(merge(df1,df2, by=c("birth_date", "country", "work_establishment"), suffixes=c("_2014", "_2015")))

但我无法同时处理多个数据帧。

谢谢!

您可以获得列表中的所有数据帧。

list_df <- mget(paste0('df', 1:3))
#OR
#list_df <- list(df1, df2, df3)

然后从 year_sample 值向每个数据框中的 'Wage' 列添加后缀并删除年份列并使用 Reducemerge 数据框合二为一.

result <- Reduce(function(x, y)
             merge(x, y, by=c("birth_date", "country", "work_establishment")), 
             lapply(list_df, function(x) 
              {names(x)[5] <- paste('Wage', x$year_sample[1], sep = '_');x[-1]}))

result

#  birth_date country work_establishment Wage_2014 Wage_2015 Wage_2016
#1       1990  FRANCE             X4T346      6574      6574      6574
#2       1992  CANADA                X26      2553      2700      2353
#3       1995      US              X2134      1700      1756      1750
#4       1996      US                X26      1232      1230      1032