【问题标题】:Merging two dataframes using only columns from one dataframe and ignoring others in R仅使用一个数据帧中的列合并两个数据帧,而忽略 R 中的其他数据帧
【发布时间】:2015-03-29 14:22:02
【问题描述】:

我正在尝试合并两个数据框,我一直在阅读不同的帖子,但我找不到获得所需输出的方法。

dfA:
Name Surname C
Ja Men T
Ale Bu T
Ge Men 

dfB:

Name Surname C Ex
Ge Men T hello
Je Di T hello

期望的输出:

Merge:
Name Surname C
Ja Men T
Ale Bu T
Ge Men T
Je Di T

也就是说,用 dfB 中的可用列填充 dfA 中的列,并忽略 dfB 中不存在于 dfA 中的列。

我试过了:

merge(dfA,dfB, by=c("Name", "Surname", "Caracter"), all.x = T)

和其他组合的合并。我尝试使用 dplyr 但无法获得满意的结果。

我们将不胜感激。

提前致谢

数据:

dfA <- data.frame(
  name=c("Ja", "Ale", "Ge"),
  surname=c("Men", "Bu", "Men"), 
  C= c("T", "T", NA))

dfB <- data.frame(
  name=c("Ge", "Je"),
  surname=c("Men","Di"), 
  C= c("T","T"),
  X = c("hello","hello"))

使用 dput():

# based on dput(dfA)
dfA <- structure(list(name = structure(c(3L, 1L, 2L), .Label = c("Ale", 
"Ge", "Ja"), class = "factor"), surname = structure(c(2L, 1L, 
2L), .Label = c("Bu", "Men"), class = "factor"), C = structure(c(1L, 
1L, NA), .Label = "T", class = "factor")), .Names = c("name", 
"surname", "C"), row.names = c(NA, -3L), class = "data.frame")

# based on dput(dfB)
dfB <- structure(list(name = structure(1L, .Label = "Ge", class = "factor"), 
    surname = structure(1L, .Label = "Men", class = "factor"), 
    C = "T", X = structure(1L, .Label = "hello", class = "factor")), 
    .Names = c("name", "surname", "C", "X"), 
    row.names = c(NA, -1L), class = "data.frame")

【问题讨论】:

  • 请提供一个可重现的例子。
  • 查看更新后的帖子。谢谢你!
  • dput 在两个数据框上更新答案
  • 我将 T 更改为字符串“T”。但我只想替换值,这是一个玩具示例。再次感谢。
  • 试试full_join(dfB, dfA) %&gt;% select(-X) %&gt;% group_by(name, surname) %&gt;% na.omit()

标签: r dataframe


【解决方案1】:

假设输入与问题末尾所示的输出相同,我们执行dfAdfB 的左连接。请注意,coalese 返回其第一个非空参数——NAs 被视为 SQL 空值:

library(sqldf)
sqldf("select A.Name, A.Surname, coalesce(A.C, B.C) C
       from dfA A left join dfB B on A.Name = B.Name and A.Surname = B.Surname")

给予:

  name surname C
1   Ja     Men T
2  Ale      Bu T
3   Ge     Men T

【讨论】:

  • 我在 OSX 上工作,Quartz 有问题,我会在解决这个问题后检查答案。谢谢!
  • 你能解释一下这个函数在做什么吗?再次感谢。
  • 我在安装软件包和获取错误时遇到问题。也许使用另一个包的另一种方式......对此感到抱歉
  • 您使用的是旧版本的 R 吗?也许你需要买一个更新的。
  • 我更新了版本并且成功了!!因此,为了使这个可重现到其他变量,我是否只需要将 coalesce(A.variablename, B.variablename) variablename 添加到函数的第一部分?
【解决方案2】:

我们可以使用我的包safejoin 中的safe_full_join,并使用dplyr::coalesce 解决列冲突:

# devtools::install_github("moodymudskipper/safejoin")
library(safejoin)
library(dplyr)
safe_full_join(dfA, dfB[names(dfA)], by=c("name","surname"), conflict = coalesce, check="") 
#   name surname C
# 1   Ja     Men T
# 2  Ale      Bu T
# 3   Ge     Men T
# 4   Je      Di T

check = "" 用于不显示警告,因为我们正在加入不同级别的因子列

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2017-01-03
    • 2016-07-01
    • 2021-03-10
    相关资源
    最近更新 更多