簡體   English   中英

R:根據列中的值合並兩個數據框並返回兩個數據框的所有值

[英]R: Merge two data frames based on value in column and return all values of both data frames

假設我有以下 dfs

df1:
a b c d
1 2 3 4
4 3 3 4
9 7 3 4

df2:
a b c d
1 2 3 4
2 2 3 4
3 2 3 4

現在我想合並列“a”的兩個 dfs 條件,給我以下 df

a b c d
1 2 3 4
4 3 3 4
9 7 3 4
2 2 3 4
3 2 3 4

在我的數據集中我嘗試使用

merge <- merge(x = df1, y = df2, by = "a", all = TRUE)

然而,雖然 df1 有 50,000 個條目,df2 有 100,000 個條目,並且列 a 中肯定有匹配的值,但合並后的 df 有超過一百萬個條目。 我不明白。 據我了解,應該是最大的。 合並的 df 中有 150,000 個條目,這就是當兩個 dfs 之間 a 列中沒有值相等時的情況。

我認為你想要做的不是merge而是rbind兩個數據幀並刪除duplicated行:

數據

df1 <- data.frame(a = c(1,4,9),
                  b = c(2,3,7),
                  c = c(3,3,3),
                  d = c(4,4,4))
df2 <- data.frame(a = c(1,2,3),
                  b = c(2,2,2),
                  c = c(3,3,3),
                  d = c(4,4,4))

解決方案

行綁定df1df2

df3 <- rbind(df1, df2)

刪除重復的行:

df3 <- df3[!duplicated(df3), ]

結果

df3
  a b c d
1 1 2 3 4
2 4 3 3 4
3 9 7 3 4
5 2 2 3 4
6 3 2 3 4

使用tidyverse ,我們可以做bind_rowsdistinct

library(dplyr)
bind_rows(df1, df2) %>%
     distinct

數據

df1 <- structure(list(a = c(1, 4, 9), b = c(2, 3, 7), c = c(3, 3, 3), 
    d = c(4, 4, 4)), class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(a = c(1, 2, 3), b = c(2, 2, 2), c = c(3, 3, 3), 
    d = c(4, 4, 4)), class = "data.frame", row.names = c(NA, 
-3L))

這是可能的

dplyr::union(df1, df2)

這是另一個使用rbind + %in%基本 R 解決方案

dfout <- rbind(df1,subset(df2,!a %in% df1$a))

以至於

> rbind(df1,subset(df2,!a %in% df1$a))
   a b c d
1  1 2 3 4
2  4 3 3 4
3  9 7 3 4
21 2 2 3 4
31 3 2 3 4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM