【问题标题】:How can I merge two data frames with 500+ columns each, and 200+ overlapping columns?如何合并两个具有 500 多列和 200 多列重叠列的数据框?
【发布时间】:2014-03-05 01:49:02
【问题描述】:

我有几个数据框,我需要将它们合并到一个数据框中以将它们全部统治。主数据框最终将包含数千列。所有数据框都有一个要加入的 ID 列。一个问题是数百列在数据帧中重复。另一个问题是这些列中的少数包含不一致的值。我想找到一种方法来

  1. 合并所有数据框,如果列名重复且数据框之间的值不冲突,则仅保留 1 个“主列”数据
  2. 如果两列数据名称相同,但它们的值有冲突,则保留这两列数据。

是否有任何软件包可以帮助实现这一点?还是我会被困在编写大量代码/手动检查数据?

【问题讨论】:

  • 它们是否都具有相同的行数和相同的 ID?
  • @flodel 每个数据框中的行数不同。 ID 在数据帧中是准确的,但并非所有 ID 都会在每个数据帧中找到。我们确实有一个包含所有 ID 的数据框——因此我们可能会将所有数据框连接到该数据框。我们将在一个或多个数据帧中找不到 ID 中的相当数量的 NA 值,但这对于分析来说是可以的。
  • 您能否将数据重塑为“更长”的格式?即,通过创建因子列来减少列数?数千列通常不是存储数据的首选方式。这可能与此处相关:vita.had.co.nz/papers/tidy-data.pdf。您的第二个要求可能会降低此操作的效率。您可能需要修改merge.data.frame

标签: r merge dataframe


【解决方案1】:

我写了包safejoin,它非常简洁地解决了这个问题:

#devtools::install_github("moodymudskipper/safejoin")
library(safejoin)

查看以下数据帧,A在两者中相同,B在df1df2中不同, CD 仅在一个数据帧中

df1 <- data.frame(id = 1:2, A = 3:4, B= 5:6,  C = 7:8)
df2 <- data.frame(id = 1:2, A = 3:4, B= 9:10, D = 11:12)

library(tidyverse)
safe_full_join(df1, df2, by = "id", conflict = ~ if(identical(.x, .y)) .x else 
                   map2( .x, .y,~tibble(df1=.x,df2=.y))) %>%
  unnest(.sep="_")
#   id A C  D B_df1 B_df2
# 1  1 3 7 11     5     9
# 2  2 4 8 12     6    10L

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多