2013-07-13 88 views
0

我有兩個數據幀 - 一個是巨大(超過200萬行)和一個較小(約30萬行)。較小的數據框是較大數據框的一個子集。唯一的區別是較大的有一個額外的屬性,我需要添加到較小的一個。合併2數據幀,丟棄不匹配的行

具體地,對於大的數據幀的屬性(日期,時間,地址,標誌)和用於小的數據幀的屬性(日期,時間,地址)。我需要以某種方式將正確的相應標誌值存入每行較小的數據幀中。 「合併」數據幀的最終大小應該與我的較小數據幀相同,從大數據幀中丟棄未使用的行。

完成此操作的最佳方法是什麼?

更新:我測試用下面的合併函數:

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 
+1

'merge'默認情況下將只返回行的表現兩個輸入相匹配。 –

+0

如果我使用合併,將返回的數據幀的大小等於較小的一個? – whistler

+0

以及它會從一個更大的一些資料...那你幹嘛要來合併。看看'?merge' –

回答

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 
+0

我試過你發佈的簡單合併例子,但在我的數據上,並得到了我在我的問題中發佈的相同警告消息。同樣,返回的數據框是空的。我不知道是什麼原因導致我的數據出現問題,但是現在我得到了如何進行合併。你之前看過這樣的警告錯誤嗎? – whistler

+0

沒關係!我想出了爲什麼我會得到這個錯誤。其中一列具有不同的數據類型! – whistler

+0

@whistler。恭喜!看到這個以供將來參考http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

3

也許plyr是這個操作的更直觀的包。你需要的是一個SQL內部連接。我相信這種方法比merge()更清晰。

這裏是你將如何使用連接)的數據集的大小的一個簡單的例子(。

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") 

這裏是連接()與合併()

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