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

unc*_*ool 7 r dplyr

我有两张桌子希望left_join通过dplyr套餐。问题是它会NA为所有新列(我后面的列)生成值。

\n\n

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

\n\n

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

\n\n

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

\n\n
> head(Avanza.XML)\n                      Firm Gain.Month.1 Last.Price Vol.Month.1\n1     Stockwik F\xc3\xb6rvaltning       131.25      0.074   131264420\n2                 Novestra        37.14      7.200      605330\n3       Bactiguard Holding        29.55     14.250     2815572\n4              MSC Group B        20.87      3.070      671855\n5 NeuroVive Pharmaceutical        18.07      9.800     3280944\n6      Shelton Petroleum B        16.21      3.800     2135798\n\n> head(checkpoint)\n                      Firm Gain.Month.1 Last.Price Vol.Month.1 Incep.Price DayCounter\n1     Stockwik F\xc3\xb6rvaltning        87.50       0.06    91270090    0.032000 2016-01-25\n2                 Novestra        38.10       7.25      604683    5.249819 2016-01-25\n3       Bactiguard Holding        29.09      14.20     2784161   11.000077 2016-01-25\n4              MSC Group B        27.56       3.24      657699    2.539981 2016-01-25\n5      Shelton Petroleum B        19.27       3.90     1985305    3.269892 2016-01-25\n6 NeuroVive Pharmaceutical        16.87       9.70     3220303    8.299820 2016-01-25\n\n> head(left_join(Avanza.XML, checkpoint))\nJoining by: c("Firm", "Gain.Month.1", "Last.Price", "Vol.Month.1")\n                      Firm Gain.Month.1 Last.Price Vol.Month.1 Incep.Price DayCounter\n1     Stockwik F\xc3\xb6rvaltning       131.25      0.074   131264420          NA       <NA>\n2                 Novestra        37.14      7.200      605330          NA       <NA>\n3       Bactiguard Holding        29.55     14.250     2815572          NA       <NA>\n4              MSC Group B        20.87      3.070      671855          NA       <NA>\n5 NeuroVive Pharmaceutical        18.07      9.800     3280944          NA       <NA>\n6      Shelton Petroleum B        16.21      3.800     2135798          NA       <NA>\nWarning message:\nIn left_join_impl(x, y, by$x, by$y) :\n  joining factors with different levels, coercing to character vector\n
Run Code Online (Sandbox Code Playgroud)\n

akr*_*run 7

有两个问题。

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

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

    Avanza.XML$Firm <- as.character(Avanza.XML$Firm)
    checkpoint$Firm <- as.character(checkpoint$Firm)
    
    Run Code Online (Sandbox Code Playgroud)

或者,如果我们仍然想将列保留为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)
Run Code Online (Sandbox Code Playgroud)

然后执行left_join.