【问题标题】:dplyr::left_join produce NA values for new joined columnsdplyr::left_join 为新连接的列生成 NA 值
【发布时间】:2016-01-26 14:36:35
【问题描述】:

我有两张表我希望通过dplyrleft_join。问题是为所有新列(我所追求的列)生成NA 值。

如下所示,left_joinIncep.PriceDayCounter 的新列生成 NA 值。为什么会发生这种情况,如何解决?

更新:感谢@akrun,使用left_join(Avanza.XML, checkpoint, by = c('Firm' = 'Firm')) 解决了问题并且列正确连接。

但是警告消息是一样的,有人可以解释这种行为吗?为什么在这种情况下必须明确指定 join 列,或者生成 NA 值?

> head(Avanza.XML)
                      Firm Gain.Month.1 Last.Price Vol.Month.1
1     Stockwik Förvaltning       131.25      0.074   131264420
2                 Novestra        37.14      7.200      605330
3       Bactiguard Holding        29.55     14.250     2815572
4              MSC Group B        20.87      3.070      671855
5 NeuroVive Pharmaceutical        18.07      9.800     3280944
6      Shelton Petroleum B        16.21      3.800     2135798

> head(checkpoint)
                      Firm Gain.Month.1 Last.Price Vol.Month.1 Incep.Price DayCounter
1     Stockwik Förvaltning        87.50       0.06    91270090    0.032000 2016-01-25
2                 Novestra        38.10       7.25      604683    5.249819 2016-01-25
3       Bactiguard Holding        29.09      14.20     2784161   11.000077 2016-01-25
4              MSC Group B        27.56       3.24      657699    2.539981 2016-01-25
5      Shelton Petroleum B        19.27       3.90     1985305    3.269892 2016-01-25
6 NeuroVive Pharmaceutical        16.87       9.70     3220303    8.299820 2016-01-25

> head(left_join(Avanza.XML, checkpoint))
Joining by: c("Firm", "Gain.Month.1", "Last.Price", "Vol.Month.1")
                      Firm Gain.Month.1 Last.Price Vol.Month.1 Incep.Price DayCounter
1     Stockwik Förvaltning       131.25      0.074   131264420          NA       <NA>
2                 Novestra        37.14      7.200      605330          NA       <NA>
3       Bactiguard Holding        29.55     14.250     2815572          NA       <NA>
4              MSC Group B        20.87      3.070      671855          NA       <NA>
5 NeuroVive Pharmaceutical        18.07      9.800     3280944          NA       <NA>
6      Shelton Petroleum B        16.21      3.800     2135798          NA       <NA>
Warning message:
In left_join_impl(x, y, by$x, by$y) :
  joining factors with different levels, coercing to character vector

【问题讨论】:

  • 我认为您可以通过Firm 加入,而不是通过所有列加入。如果您查看这些值,这些值在 Gain.Month.1 和其他列中不匹配。
  • 公司不会自动加入 dplyr 吗?
  • 不,您已经在by 语句中指定了列
  • 警告是因为“公司”列是factor,并且在两个数据集中具有不同的级别。您可以将该列转换为character 类,不会有任何警告。即Avanza.XML &lt;- Avanza.XML %&gt;% mutate(Firm = as.character(Firm)) 和其他数据集类似,然后进行连接。

标签: r dplyr


【解决方案1】:

有两个问题。

  1. 未在left_join 中指定by 参数:在这种情况下,默认情况下,所有列都用作要连接的变量。如果我们查看列 - “Gain.Month.1”、“Last.Price”、“Vol.Month.1” - 所有 numeric 类并且在每个数据集中都没有匹配值。所以,最好通过“公司”加入

    left_join(Avanza.XML, checkpoint, by = "Firm")
    
  2. “Firm”列类 - factor:当factor 列的levels 存在差异时(如果它是我们连接的变量),我们会收到警告。为了消除警告,我们可以将两个数据集中的“Firm”列转换为character

    Avanza.XML$Firm <- as.character(Avanza.XML$Firm)
    checkpoint$Firm <- as.character(checkpoint$Firm)
    

或者,如果我们仍希望将列保留为 factor,则将“公司”中的 levels 更改为在两个数据集中包含所有 levels

lvls <- sort(unique(c(levels(Avanza.XML$Firm), 
                          levels(checkpoint$Firm))))
Avanza.XML$Firm <- factor(Avanza.XML$Firm, levels=lvls)
checkpoint$Firm <- factor(checkpoint$Firm, levels=lvls)

然后执行left_join

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2014-11-09
    • 2020-03-27
    • 1970-01-01
    • 2021-09-24
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多