【问题标题】:Merge 2 data frames, discard unmatched rows合并 2 个数据帧,丢弃不匹配的行
【发布时间】:2013-07-13 02:24:29
【问题描述】:

我有两个数据框——一个很大(超过 200 万行),一个较小(大约 300,000 行)。较小的数据帧是较大数据帧的子集。唯一的区别是较大的有一个附加属性,我需要将其添加到较小的属性中。

具体来说,大数据框的属性是(日期、时间、地址、标志),小数据框的属性是(日期、时间、地址)。我需要以某种方式将正确的相应标志值放入每行的较小数据框中。 “合并”数据框的最终大小应与我的较小数据框相同,从大数据框中丢弃未使用的行。

最好的方法是什么?

更新:我用以下方法测试了合并功能:

new<-merge(data12, data2, by.x = c("Date", "Time", "Address"), 
           by.y=c("Date", "Time", "Address"))

new<-merge(data12, data2, by = c("Date", "Time", "Address"))

两者都返回具有正确数量的属性的空数据框(新)以及以下警告消息:

Warning message:In `[<-.factor`(`*tmp*`, ri, value = c(15640, 15843, 15843, 15161,  : invalid factor level, NAs generated

【问题讨论】:

  • merge 默认只返回两个输入匹配的行。
  • 如果我使用merge,返回的数据框的大小会等于较小的那个吗?
  • 嗯,它会有一些来自更大的信息......你为什么要合并。看?merge
  • 显然,我希望有一个附加属性。我的意思是行数等于较小的行数。
  • @whistler 提供一个简短的示例对您来说是件好事——但这样做,您会发现merge 完全符合您的要求。

标签: r merge dataframe


【解决方案1】:
    R> df1 = data.frame(a = 1:5, b = rnorm(5))
    R> df1
      a           b
    1 1 -0.09852819
    2 2 -0.47658118
    3 3 -2.14825893
    4 4  0.82216912
    5 5 -0.36285430
    R> df2 = data.frame(a = 1:10000, c = rpois(10000, 6))
    R> head(df2)
      a c
    1 1 2
    2 2 4
    3 3 5
    4 4 3
    5 5 3
    6 6 8
    R> merge(df1, df2)
      a           b c
    1 1 -0.09852819 2
    2 2 -0.47658118 4
    3 3 -2.14825893 5
    4 4  0.82216912 3
    5 5 -0.36285430 3

【讨论】:

  • 我尝试了您发布的简单合并示例,但在我的数据上并收到了与我在问题中发布的相同警告消息。同样,返回的数据框是空的。我不知道是什么导致我的数据出现问题,但我现在知道如何进行合并。你以前见过这样的警告错误吗?
  • 没关系!我弄清楚了为什么会出现该错误。其中一列具有不同的数据类型!
  • @whistler。恭喜!请参阅此内容以供将来参考stackoverflow.com/questions/5963269/…
【解决方案2】:

也许 plyr 是这个操作的更直观的包。你需要的是一个 SQL 内连接。我相信这种方法比 merge() 更清晰。

这里是一个简单的例子,说明如何将 join() 用于您的大小的数据集。

library(plyr)

id = c(1:2000000)
rnormal <- rnorm(id)
rbinom <- rbinom(2000000, 5,0.5)


df1 <- data.frame(id, rnormal, rbinom)
df2 <- data.frame(id = id[1:300000], rnormal = rnormal[1:300000])

您想将 rbinom 添加到 df2

joined.df <- join(df1, df2, type = "inner")

这是 join() 与 merge() 的表现

system.time(joined.df <- join(df1, df2, type = "inner"))
Joining by: id, rnormal
   user  system elapsed 
  22.44    0.53   22.80 
system.time(merged.df <- merge(df1, df2))
   user  system elapsed 
 26.212   0.605  30.201 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    • 2015-12-19
    • 2013-10-18
    • 2021-12-12
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多