0

在 R 中合并 2 个 data.frames 时,我遇到了一个小问题。

我正在尝试合并 2 个具有相同列名的 data.frames,我希望 R 将相同名称的列合并为一列,而不是使其成为 2 个单独的列。

通常,当 R 在合并 data.frames 时遇到相同名称的列时会发生什么,它会创建 2 个带后缀“x”和“y”的单独变量。有没有办法在合并命令中指定这一点,以将不同数据集中的相似名称列视为一个列/变量?

我们可以用作示例的代码:

x = data.frame(id = c("a","c","d","g"), 
              maths = c(1,3,4,7),  physics = c(1,3,4,7),  chemistry = c(1,3,4,7),  
           english = c(1,3,4,7))
y = data.frame(id = c("b","c","d","e","f"),
                maths = c(5,6,8,9,7), physics = c(5,6,8,9,7), chemistry = c(5,6,8,9,7),
           english = c(5,6,8,9,7))

xy <- merge(x, y, by = "id")

现在有一种解决方法,我们可以在合并数据集中创建一个新变量,该变量从同名列中获取非 NA 值,但是如果您有大量列,这将非常低效。

SAS 用户会与此问题相关,因为专业 SAS 用户引起了我的注意,merge() 语句将 2 个相同名称的列合并为一列。

此外,作为下面提到的答案之一,如果我们使用:

xy <- merge(x, y, by = intersect(names(x), names(y)))

我们在 2 个 data.frames 之间没有交集。理想情况下,我们希望这里有 4 个观察值,2 个 data.frames 中的每个观察值 2 个 id = c("c","d")

非常感谢任何专业的 R 用户帮助我解决这个问题。

谢谢!

4

2 回答 2

2

你真的想合并还是rbind(x,y)你正在寻找什么?在您的示例中,结果相同data.frame(按 排序后id)。如果要实际合并data.frames,则必须指定不想重复的名称:

merge(x, y, all=TRUE)
merge(x, y, by = c("id", "maths", "physics", "chemistry", "english"), all = TRUE)
于 2013-07-17T07:14:33.207 回答
0

这是我的快速解决方案。

希望能帮助到你。注意x的第一列是我要加入的id

output <- merge(x[!(names(x)[2:length(names(x))] %in% names(y))], y, by.x = "id", by.y="id", all=TRUE)
于 2015-06-11T12:35:52.653 回答