连接和合并不会返回R中正确的行数

时间:2017-02-13 16:10:21

标签: r join merge dplyr

我有两个共享一个公共列(名为sys_loc_code)的数据帧。第一个数据帧(df1)有1033行。第二个数据帧(df2)有2751.

我想组合df1和df2,所以得到一个新的数据帧,其中df1和df2中的所有列只保留df1中的行。

我尝试了joinleft_joininner_join(来自dplyr)和一个简单的merge。每个都返回2057行,我认为它应该只返回1033以匹配df1中的内容。如何仅返回df1中的行?

我无法共享导致此问题的数据集。但是,经过一些咨询后,我可以用这个最小的例子重新创建问题:

df1 <-
  data.frame(
    sys_loc_code = c("A", "B", "C")
    , df1Val = 1
  )


df2 <-
  data.frame(
    sys_loc_code = c("A", "B", "B", "C", "D")
    , df2Val = c(1, 1, 2, 1, 1)
  )

left_join(df1, df2)

返回4行,而df1只有3行。

1 个答案:

答案 0 :(得分:0)

最大问题是df2$sys_loc_code包含df1$sys_loc_code中某些值的多个条目。

df1$sys_loc_code只有3个值,但其中一个(“B”)在df2$sys_loc_code中出现两次,这意味着这些合并将返回4行。 e.g。

left_join(df1, df2)

给出

  sys_loc_code df1Val df2Val
1            A      1      1
2            B      1      1
3            B      1      2
4            C      1      1

因此,对您的问题的简短回答可能是根据您编写的代码,结果实际上是“正确的”。如果您想要发生不同的事情(例如,每场比赛只有df2只有一个条目),您可能需要准确确定所需的输出。

例如,如果您想要df2的第一个条目:

left_join(
  df1
  , df2 %>%
    group_by(sys_loc_code) %>%
    slice(1)
)

给出

  sys_loc_code df1Val df2Val
1            A      1      1
2            B      1      1
3            C      1      1


left_join(
  df1
  , df2 %>%
    group_by(sys_loc_code) %>%
    summarise(df2Val = mean(df2Val))
)

给出

  sys_loc_code df1Val df2Val
1            A      1    1.0
2            B      1    1.5
3            C      1    1.0

left_join(
  df1
  , df2 %>%
    mutate(aVarToSortOn = 1:n()) %>%
    group_by(sys_loc_code) %>%
    slice(which.max(aVarToSortOn))
)

给出

  sys_loc_code df1Val df2Val aVarToSortOn
1            A      1      1            1
2            B      1      2            3
3            C      1      1            4

如果您知道列中包含唯一值,则还可以使用filter选择要保留的匹配项df2