我需要合并两个数据帧,但我无法获得对我有意义的输出。我试过使用左连接和全连接,但都有问题。
其中一个数据框 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
变量应仅由 NA
组成。
> length(unique(parquet$prov_id))
[1] 1305
> length(unique(main$prov_id))
[1] 2132
我也尝试过使用完全联接(为了简单起见,我将使用这种类型的联接创建的文件称为 p
),但结果略有不同。
并非所有的treat
值都是NA
,但大部分都是,并且NA
的数量与main
中的观察数量相同.此外,0
中 1
和 p
的数量与 parquet
中这些值的数量相同。
我要补充的另一件事是,当 treat
在 NA
中不是 p
时,所有其他变量的值除了 {{ 1}} 是。这意味着我无法使用 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
中的 __index_level_0__
应该代表什么。它是一个 0 索引的数字序列,用于计算此数据集中的行数,因此可能只是错误地包含了它。但也许它应该代表年份变量?我不确定。
关于如何让这个工作有任何建议?我尝试过其他类型的连接,但结果更糟(0 次观察)。我需要正确合并这些数据,以便我可以用它来估计一些统计模型,但到目前为止我的输出无法使用。
提前感谢您的建议。
答案 0 :(得分:1)
使用 parquet$prov_id <- toupper(parquet$prov_id)
在 parquet
中得到大写的 Z,正如威廉所评论的那样。方法如下:
library(tidyverse)
main <- tribble(
~year, ~prov_id, ~tech_1, ~teach, ~beds, ~nonprof, ~govt,
"2007", "11Z111", 0, 0, 35, 0, 1,
"2010", "11Z111", 0, 0, 35, 0, 1,
"2001", "11Z111", 0, 0, 35, 0, 1,
"2005", "11Z111", 0, 0, 35, 0, 1,
"2002", "11Z111", 0, 0, 35, 0, 1,
"2004", "11Z111", 0, 0, 35, 0, 1)
parquet <- tribble(
~prov_id, ~treat, ~`__index_level_0__`,
"11z111", 0, 0,
"11z113", 0, 1,
"11z132", 0, 2,
"11z135", 0, 3,
"11z13z", 0, 4,
"11z142", 0, 5)
parquet$prov_id <- toupper(parquet$prov_id)
df_joined <- main %>%
full_join(parquet, by="prov_id")