我有两个数据框 - 一个是巨大的(超过200万行),另一个是较小的(大约300,000行)。较小的数据帧是较大的数据帧的子集。唯一的区别是较大的一个属性需要添加到较小的属性中。
具体地说,大数据帧的属性是(日期,时间,地址,标志),小数据帧的属性是(日期,时间,地址)。我需要以某种方式将正确的相应Flag值输入到每行的较小数据帧中。 “合并”数据帧的最终大小应与我的较小数据帧相同,从大数据帧中丢弃未使用的行。
实现这一目标的最佳方法是什么?
更新:我用以下方法测试了合并功能:
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
答案 0 :(得分:4)
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
答案 1 :(得分:3)
也许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()vs 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