【问题标题】:trouble merging a couple of dataframes合并几个数据框的麻烦
【发布时间】: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,而不是 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 变量应该只包含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,感谢您指出这一点!不,我一开始没有注意到。处理此问题后,我的数据现在似乎与左连接正确合并。

标签: r dataframe join merge


【解决方案1】:

使用parquet$prov_id &lt;- toupper(parquet$prov_id)parquet 中获取大写Z,正如William 所评论的那样。方法如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2019-02-06
    • 1970-01-01
    相关资源
    最近更新 更多