我有两张桌子希望left_join通过dplyr套餐。问题是它会NA为所有新列(我后面的列)生成值。
如下所示,为和的新列left_join生成值。为什么会发生这种情况?如何解决?NAIncep.PriceDayCounter
更新:感谢@akrun,使用left_join(Avanza.XML, checkpoint, by = c(\'Firm\' = \'Firm\'))解决了问题并且列已正确连接。
但是警告消息是一样的,有人可以解释这种行为吗?为什么在这种情况下必须显式指定join列,或者以其他方式生成NA值?
> 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\nRun Code Online (Sandbox Code Playgroud)\n
有两个问题。
未指定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)“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.