合并几个数据帧时遇到问题

时间:2021-03-21 06:27:19

标签: r dataframe join merge

我需要合并两个数据帧,但我无法获得对我有意义的输出。我试过使用左连接和全连接,但都有问题。

其中一个数据框 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 而不是 01。我不明白为什么会这样。它可能与我正在使用的数据类型有关吗?我以前从未使用过镶木地板文件。这似乎不相关,因为 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中的观察数量相同.此外,01p 的数量与 parquet 中这些值的数量相同。

我要补充的另一件事是,当 treatNA 中不是 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 次观察)。我需要正确合并这些数据,以便我可以用它来估计一些统计模型,但到目前为止我的输出无法使用。

提前感谢您的建议。

1 个答案:

答案 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")

enter image description here