基于 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'
列添加后缀并删除年份列并使用 Reduce
到 merge
数据框合二为一.
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
我有两个问题合二为一。我有 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'
列添加后缀并删除年份列并使用 Reduce
到 merge
数据框合二为一.
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