R 合并2个数据帧,放弃不匹配的行

R 合并2个数据帧,放弃不匹配的行,r,merge,dataframe,R,Merge,Dataframe,我有两个数据帧——一个是巨大的(超过200万行),另一个是较小的(大约300000行)。较小的数据帧是较大数据帧的子集。唯一的区别是,较大的一个有一个额外的属性,我需要添加到较小的一个 具体来说,大数据帧的属性是(日期、时间、地址、标志),小数据帧的属性是(日期、时间、地址)。我需要以某种方式将正确的对应标志值放入每行的较小数据帧中。“合并”数据框的最终大小应与较小数据框的大小相同,从大数据框中丢弃未使用的行 实现这一目标的最佳方式是什么 更新:我使用以下内容测试了合并函数: new<-m

我有两个数据帧——一个是巨大的(超过200万行),另一个是较小的(大约300000行)。较小的数据帧是较大数据帧的子集。唯一的区别是,较大的一个有一个额外的属性,我需要添加到较小的一个

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

实现这一目标的最佳方式是什么

更新:我使用以下内容测试了合并函数:

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

new也许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])
库(plyr)
id=c(1:2000000)

r默认情况下,normal
merge
只返回两个输入匹配的行。如果使用merge,返回的数据帧的大小是否等于较小的数据帧?它将从较大的数据帧中获取一些信息。。。否则你为什么要合并。查看
?合并
很清楚,我希望有一个附加属性。我的意思是行数等于较小的一行。@whistler您最好提供一个简短的示例,但这样做时,您会发现
merge
正是您想要的。我尝试了您发布的简单合并示例,但基于我的数据,得到了与我在问题中发布的相同的警告消息。同样,返回的数据帧是空的。我不知道是什么导致了我的数据出现问题,但我现在知道了如何进行合并。你以前见过这样的警告错误吗?没关系!我知道我为什么会犯那个错误了。其中一列具有不同的数据类型@惠斯勒。恭喜!见此以备将来参考
Warning message:In `[<-.factor`(`*tmp*`, ri, value = c(15640, 15843, 15843, 15161,  : invalid factor level, NAs generated
    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
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])
joined.df <- join(df1, df2, type = "inner")
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