【发布时间】:2021-03-21 06:27:19
【问题描述】:
我需要合并两个数据框,但我无法获得对我有意义的输出。我尝试过使用左连接和完全连接,但都有问题。
其中一个数据框main 包含有关提供者特征的信息,另一个parquet 包含有关提供者是否受到特定策略影响的信息。我需要合并它们以便做一些分析工作。
我有一个名为 main 的 stata 文件,使用 foreign 将其读入 r 后看起来像这样。
year prov_id tech_1 teach beds nonprof govt
1 2007 11Z111 0 0 35 0 1
2 2010 11Z111 0 0 35 0 1
3 2001 11Z111 0 0 35 0 1
4 2005 11Z111 0 0 35 0 1
5 2002 11Z111 0 0 35 0 1
6 2004 11Z111 0 0 35 0 1
我有一个名为parquet 的镶木地板文件,其中包含有关prov_id 是否收到treat 的信息,在使用arrow 将其读入r 后看起来像这样。
prov_id treat `__index_level_0__`
<chr> <dbl> <int>
1 11z111 0 0
2 11z113 0 1
3 11z132 0 2
4 11z135 0 3
5 11z13z 0 4
6 11z142 0 5
在进行左连接 (left_join(main, parquet, by = 'prov_id')) 后,treat 的所有值都是 NA,而不是 0 或 1。我不明白为什么会这样。它可能与我正在使用的数据类型有关吗?我以前从未使用过镶木地板文件。这似乎不相关,因为 r 已将两个文件都转换为数据帧,我认为这应该使它们兼容。
year prov_id tech_1 teach beds nonprof govt treat __index_level_0__
1 2007 11Z111 0 0 35 0 1 NA NA
2 2010 11Z111 0 0 35 0 1 NA NA
3 2001 11Z111 0 0 35 0 1 NA NA
4 2005 11Z111 0 0 35 0 1 NA NA
5 2002 11Z111 0 0 35 0 1 NA NA
6 2004 11Z111 0 0 35 0 1 NA NA
我认为其中一个问题可能是两个数据集中有不同数量的唯一 prov_id 值,因此产生一些 NA 值可能是不可避免的,但我不认为整个 treat 变量应该只包含NAs。
> length(unique(parquet$prov_id))
[1] 1305
> length(unique(main$prov_id))
[1] 2132
我也尝试过使用完全连接(为简单起见,我将使用这种类型的连接创建的文件称为 p),结果有点不同。
并非所有的treat 值都是NA,但大多数是,NAs 的数量与main 中的观察数量相同。此外,p 中的0s 和1s 的数量与parquet 中这些值的数量相同。
我应该补充的另一件事是,当treat 不是p 中的NA 时,除prov_id 之外的所有其他变量的值都是。这意味着我不能使用p 来估计treat 与任何其他变量之间的关系。
> table(p$treat, useNA = 'ifany')
0 1 <NA>
1278 27 13050
> table(parquet$treat)
0 1
1278 27
> nrow(main)
[1] 13050
最后一个问题:我不确定parquet 中的__index_level_0__ 应该代表什么。它是一个 0 索引的数字序列,用于计算该数据集中的行数,所以它可能只是被错误地包含在内。但也许它应该代表一个年份变量?我不确定。
关于如何让这个工作的任何建议?我尝试过其他类型的连接,但结果更糟(0 次观察)。我需要正确合并这些数据,以便我可以使用它来估计一些统计模型,但到目前为止我的输出无法使用。
提前感谢您的任何建议。
【问题讨论】:
-
你有没有考虑过parquet中
prov_id中的'z'是小写的?您可以在此专栏中使用toupper()看看是否有效。 -
@William,感谢您指出这一点!不,我一开始没有注意到。处理此问题后,我的数据现在似乎与左连接正确合并。