當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。