【发布时间】:2017-10-18 07:16:44
【问题描述】:
我在 R 中有 2 个数据框:带有 175 个变量的“dfold”和带有 75 个变量的“dfnew”。 2 个数据帧由主键(即“pid”)匹配。 dfnew 是 dfold 的子集,因此 dfnew 中的所有变量也在 dfold 上,但具有更新的估算值(不再有 NA)。同时 dfold 有更多的变量,我在分析阶段需要它们。我想合并 dfmerge 中的 2 个数据框,以便从 dfnew --> dfold 更新公共变量,但同时在 dfold 中保留预先存在的变量。我已经尝试过 merge()、match()、dplyr 和 sqldf 包,但要么我获得了一个仅包含更新的 75 个变量(左连接)的 dfmerge,要么获得了一个包含 250 个变量的 dfmerge(带有 NA 的旧变量和没有它们的新变量共存)。我发现(here)的唯一方法是一个优雅但相当长(10 行)的循环,它在 pid 与 all.x = TRUE 选项合并后消除 *.x 变量)。如果可以的话,您能否建议一种更有效的方法来获得这样的结果?
提前谢谢你
P.S:为了让事情更简单,我创建了 dfold 和 dfnew 的最小版本:dfnew 现在有 3 个变量,没有 NA,而 dfold 有 5 个变量,包括 NA。这是数据帧结构
折叠:
structure(list(Country = structure(c(1L, 3L, 2L, 3L, 2L), .Label = c("France",
"Germany", "Spain"), class = "factor"), Age = c(44L, 27L, 30L,
38L, 40L), Salary = c(72000L, 48000L, 54000L, 61000L, NA), Purchased = structure(c(1L,
2L, 1L, 1L, 2L), .Label = c("No", "Yes"), class = "factor"),
pid = 1:5), .Names = c("Country", "Age", "Salary", "Purchased",
"pid"), row.names = c(NA, 5L), class = "data.frame")
dfnew:
structure(list(Age = c(44, 27, 30), Salary = c(72000, 48000,
54000), pid = c(1, 2, 3)), .Names = c("Age", "Salary", "pid"), row.names = c(NA,
3L), class = "data.frame")
虽然这里的问题仅限于 2 个变量 请注意,实际场景将涉及 75 个变量。
【问题讨论】:
-
你能提供一些有意义的样本数据吗?在 dfold-subsample 中可能每个数据框有 10 行,其中包含 5 个公共变量和另外 5 个其他变量?
-
肯定会很乐意这样做,但不确定如何在此处附加数据,有什么提示吗?
-
最好的方法是在子集上使用
dput()命令,如上所述,类似于dput(dfold[1:10, 1:10])和dput(dfnew[1:10, 1:5])(您可能需要更改列索引以获得5常见和 5 个不常见的变量)。然后将R控制台的输出(通常以structure(...开头)粘贴到您的问题文本中。 -
好的,在原帖中编辑,谢谢 :) 我刚刚让事情变得更容易,但 dfold 和 dfnew 应该仍然有效
-
我将自己重新创建它,但最佳情况下
dfnew应该包括所有 5 行,尤其是在Salary列中具有NA值的行。