合并R中的数据集

时间:2013-07-17 06:59:41

标签: r merge

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

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

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

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

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()语句将两个相同的名称列组合成一列。

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

这是我的快速解决方案。

希望它有所帮助。请注意,x的第一列是我要加入的ID

output <- merge(x[!(names(x)[2:length(names(x))] %in% names(y))], y, by.x = "id", by.y="id", all=TRUE)