当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R merge 合并两个 DataFrame


R语言 merge 位于 base 包(package)。

说明

按公共列或行名称合并两个 DataFrame ,或执行其他版本的数据库连接操作。

用法

merge(x, y, ...)

## Default S3 method:
merge(x, y, ...)

## S3 method for class 'data.frame'
merge(x, y, by = intersect(names(x), names(y)),
      by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
      sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,
      incomparables = NULL, ...)

参数

x, y

DataFrame 架,或被强制为一个的对象。

by, by.x, by.y

用于合并的列的规格。查看具体信息'。

all

逻辑性; all = Lall.x = Lall.y = L 的简写,其中 LTRUEFALSE

all.x

逻辑性;如果 TRUE ,则额外的行将添加到输出中,其中 x 中的每一行在 y 中没有匹配行。这些行将在那些通常填充 y 的值的列中包含 NA 。默认值为 FALSE ,因此输出中仅包含来自 xy 的数据的行。

all.y

逻辑性;类似于all.x

sort

合乎逻辑的。结果应该在 by 列上排序吗?

suffixes

长度为 2 的字符向量,指定用于使结果中不用于合并的列名称唯一的后缀(出现在 by 等中)。

no.dups

逻辑表明suffixes在更多情况下附加以避免结果中出现重复的列名。这在之前是隐含的错误R版本 3.5.0。

incomparables

无法匹配的值。请参阅match。这旨在用于合并一列,因此这些是该列的不可比较的值。

...

传入或传出方法的参数。

细节

merge 是一个通用函数,其主要方法用于数据帧:默认方法将其参数强制为数据帧并调用 "data.frame" 方法。

默认情况下, DataFrame 在具有它们都具有的名称的列上合并,但可以通过 by.xby.y 给出单独的列规范。提取两个 DataFrame 中与指定列匹配的行并将其连接在一起。如果有多个匹配项,则所有可能的匹配项各贡献一行。有关‘match’的确切含义,请参阅match

要合并的列可以通过名称、编号或逻辑向量指定:名称"row.names" 或数字0 指定行名称。如果按名称指定,则它必须唯一对应于输入中的命名列。

如果 byby.xby.y 的长度均为 0(长度为零的向量或 NULL ),则结果 rxy 的笛卡尔积,即dim(r) = c(nrow(x)*nrow(y), ncol(x) + ncol(y))

如果 all.x 为 true,则 x 的所有不匹配情况也会追加到结果中,并在 y 的相应列中填充 NA ;类似地 all.y

如果合并中未使用的 DataFrame 中的列有任何通用名称,则会附加suffixes(默认为".x"".y"),以尝试使结果的名称唯一。如果这是不可能的,则会抛出错误。

如果 by.x 列名称与 y 之一匹配,并且 no.dups 为 true(默认情况下),则 y 版本也会添加后缀,从而避免结果中出现重复的列名称。

所使用算法的复杂性与答案的长度成正比。

在 SQL 数据库术语中,默认值为all = FALSE给出一个自然连接,一个特殊情况内部联接。指定all.x = TRUE给出一个左(外)连接,all.y = TRUE a 右(外)连接,并且两者(all = TRUE) A(完全)外连接。 DBMS 不匹配NULL记录,相当于incomparables = NAR.

一个 DataFrame 。默认情况下,行在公共列上按字典顺序排序,但对于 sort = FALSE 来说,顺序未指定。这些列是公共列,后跟 x 中的其余列,然后是 y 中的列。如果匹配涉及行名称,则在左侧添加一个名为Row.names的额外字符列,并且在所有情况下结果都具有‘automatic’行名称。

注意

这是为了处理具有类似向量列的数据帧:某些方面适用于包含矩阵的数据帧,但不是全部。

目前,输入不接受长向量,因此限制为少于 2^31 行。该限制也适用于 32 位平台的结果。

例子

authors <- data.frame(
    ## I(*) : use character columns of names to get sensible sort order
    surname = I(c("Tukey", "Venables", "Tierney", "Ripley", "McNeil")),
    nationality = c("US", "Australia", "US", "UK", "Australia"),
    deceased = c("yes", rep("no", 4)))
authorN <- within(authors, { name <- surname; rm(surname) })
books <- data.frame(
    name = I(c("Tukey", "Venables", "Tierney",
             "Ripley", "Ripley", "McNeil", "R Core")),
    title = c("Exploratory Data Analysis",
              "Modern Applied Statistics ...",
              "LISP-STAT",
              "Spatial Statistics", "Stochastic Simulation",
              "Interactive Data Analysis",
              "An Introduction to R"),
    other.author = c(NA, "Ripley", NA, NA, NA, NA,
                     "Venables & Smith"))

(m0 <- merge(authorN, books))
(m1 <- merge(authors, books, by.x = "surname", by.y = "name"))
 m2 <- merge(books, authors, by.x = "name", by.y = "surname")
stopifnot(exprs = {
   identical(m0, m2[, names(m0)])
   as.character(m1[, 1]) == as.character(m2[, 1])
   all.equal(m1[, -1], m2[, -1][ names(m1)[-1] ])
   identical(dim(merge(m1, m2, by = NULL)),
             c(nrow(m1)*nrow(m2), ncol(m1)+ncol(m2)))
})

## "R core" is missing from authors and appears only here :
merge(authors, books, by.x = "surname", by.y = "name", all = TRUE)


## example of using 'incomparables'
x <- data.frame(k1 = c(NA,NA,3,4,5), k2 = c(1,NA,NA,4,5), data = 1:5)
y <- data.frame(k1 = c(NA,2,NA,4,5), k2 = c(NA,NA,3,4,5), data = 1:5)
merge(x, y, by = c("k1","k2")) # NA's match
merge(x, y, by = "k1") # NA's match, so 6 rows
merge(x, y, by = "k2", incomparables = NA) # 2 rows

也可以看看

data.framebycbind

dendrogram 表示具有 merge 方法的类。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Merge Two Data Frames。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。