dplyr :: left_join为新的连接列生成NA值

时间:2016-01-26 14:36:36

标签: r dplyr

我希望left_join通过dplyr包提供两个表格。问题是为所有新列(我之后的那些列)生成NA值。

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

更新:感谢@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

1 个答案:

答案 0 :(得分:1)

有两个问题。

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

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

    Avanza.XML$Firm <- as.character(Avanza.XML$Firm)
    checkpoint$Firm <- as.character(checkpoint$Firm)
    
  3. 或者,如果我们仍希望将列保持为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