【问题标题】:Find matching values in 2 dataframes with different lengths in R在 R 中查找具有不同长度的 2 个数据帧中的匹配值
【发布时间】:2021-04-10 04:26:17
【问题描述】:

我对 R 很陌生,我想做一些类似于 VLOOKUP 的事情,以在 2 个不同的数据帧中查找匹配值并返回一个带有匹配项的新数据帧。我还想获得总匹配值的总和。 它们的长度不同。不知道为什么,但是当我进行内部连接时,我得到了重复并且没有重复! 我使用这个函数来删除两个数据帧中的欺骗: df1[!duplicated(df1), ]

我已尝试此方法以返回具有匹配值的数据框:

matches <- inner_join(df1, df2)

这是我的 2 个表格的示例以及我想要的结果:

df1:

Column_Name
a
b
c
d

df2:

Column_Name
a
b
c
d
e
f
g

我想要返回的内容: df3:

Column_Name
a
b
c
d

感谢您在此提供的任何帮助!

【问题讨论】:

  • 对于您共享的示例,matches <- inner_join(df1, df2) 按预期工作并返回 a、b、c 和 d。你能提供一个实际重现问题的例子吗?
  • 是的,这似乎可行:df1 <- data.frame(column_name = letters[1:4]); df2 <- data.frame(column_name = letters[1:8]); inner_join(df1, df2)

标签: r dataframe


【解决方案1】:

我认为semi_join在这种情况下更合适:

semi_join() 返回 x y 中有匹配值 的所有行,只保留 x 中的列。半连接与内连接不同,因为内连接将为 y 的每个匹配行返回一行 x,其中半连接永远不会复制 x 的行。

df1 <- data.frame(Column_Name=c("a", "b", "c", "d"))
df2 <- data.frame(Column_Name=c("a", "b", "c", "d", "e", "f", "g"))

df3 <- semi_join(df1, df2, by = "Column_Name")

例子:

# new values in df2
df2 <- data.frame(Column_Name=c("a", "a", "b", "c", "c", "d", "e", "f", "g"))

# semi_join
df3 <- semi_join(df1, df2, by = "Column_Name")
# Output:
  Column_Name
1           a
2           b
3           c
4           d

# inner_join
df3 <- inner_join(df1, df2, by = "Column_Name")
# Output:
  Column_Name
1           a
2           a
3           b
4           c
5           c
6           d

【讨论】:

    【解决方案2】:

    Tidyverse 解决方案:

    library(tidyverse)
    # set your DataFrames, and then:
    df1 %>% inner_join(df2, by='Column_Name')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      相关资源
      最近更新 更多