簡體   English   中英

匹配R中兩個不同數據幀的列

[英]matching columns of two different data frames in R

我有兩個具有經度和緯度值的數據幀,我想從數據幀2中提取值(例如,列df2$C ,數據幀2的第三列),這些值與數據幀1的列匹配。例如,數據幀1有兩列( lonlat ),數據幀2有三列( lonlat和一些值"C" )...我想在數據幀1中添加第三列df2$C那些值對應於兩個數據幀中BOTH列的完全匹配的值,例如df1$lon == df2$lon AND df1$lat == df2$lat ...,在lat中不匹配的lon對,我想添加一個NA ,以便第三列(我想添加到數據。第1幀)的長度為= nrow(df1) 我嘗試了合並功能,但在將df1兩列與df2兩列匹配時遇到了麻煩。

您可以嘗試data.table

library(data.table)
setDT(df1)
setkey(setDT(df2), lat, lon)
df2[df1]
#   lat lon          C
#1:  58   1         NA
#2:  52  10         NA
#3:  54   7 -0.9094088
#4:  60   2         NA
#5:  50   3  1.4541841
#6:  56   9 -1.7771135
#7:  59   5         NA
#8:  55   8         NA
#9:  53   4         NA
#10: 57   6         NA

數據

df1 <- structure(list(lat = c(58L, 52L, 54L, 60L, 50L, 56L, 59L, 55L, 
53L, 57L), lon = c(1L, 10L, 7L, 2L, 3L, 9L, 5L, 8L, 4L, 6L)), .Names = c("lat", 
"lon"), row.names = c(NA, -10L), class = "data.frame")

df2 <- structure(list(lat = c(51L, 55L, 50L, 58L, 56L, 57L, 60L, 54L, 
 52L, 54L), lon = c(13L, 10L, 3L, 6L, 9L, 8L, 9L, 16L, 4L, 7L), 
 C = c(1.48642005012902, 1.53314455225747, 1.45418413640182, 
-0.874122129771392, -1.77711353745745, 0.128866710402714, 
-2.41118134931725, -1.78305563078752, -0.0173287724390305, 
-0.909408846416724)), .Names = c("lat", "lon", "C"), row.names = c(NA, 
-10L), class = "data.frame")

由於這些是地理編碼,因此需要注意的一件事是字段必須完全匹配。 因此,例如,如果一個數據集具有lon / lat到6個有效數字,而另一個數據集具有lon / lat到8個有效數字,則將沒有匹配項(或很少)。 我不知道這是為什么merge(...)對您不起作用。 如下所示,它應該可以工作。

merge(...)應該可以正常工作,尤其是當兩個數據框具有相同的列名時。 使用@akrun答案中的數據集:

merge(df1,df2, by=c("lon","lat"),all.x=TRUE)
#    lon lat          C
# 1    1  58         NA
# 2    2  60         NA
# 3    3  50  1.4541841
# 4    4  53         NA
# 5    5  59         NA
# 6    6  57         NA
# 7    7  54 -0.9094088
# 8    8  55         NA
# 9    9  56 -1.7771135
# 10  10  52         NA

如果不指定by=...參數,則merge(...)將使用所有公共列 ,因此在這種情況下,您可以編寫:

merge(df1,df2,all.x=TRUE)

您還可以使用join(...)plyr軟件包。

library(plyr)
join(df1,df2)

所有這些選項都產生相同的結果,盡管行的順序不同。

盡管沒有非常大的數據集(> 1e5行),您可能不會注意到其中的區別,但data.table方法將是最快的。

您可以為此使用ifelse 例如,使用數據:

df1 <- structure(list(lat = c(58L, 52L, 54L, 60L, 50L, 56L, 59L, 55L, 
                              53L, 57L), lon = c(1L, 10L, 7L, 2L, 3L, 9L, 5L, 8L, 4L, 6L)), .Names = c("lat", 
                                                                                                       "lon"), row.names = c(NA, -10L), class = "data.frame")

df2 <- structure(list(lat = c(51L, 55L, 50L, 58L, 56L, 57L, 60L, 54L, 
                              52L, 54L), lon = c(13L, 10L, 3L, 6L, 9L, 8L, 9L, 16L, 4L, 7L), 
                      C = c(1.48642005012902, 1.53314455225747, 1.45418413640182, 
                            -0.874122129771392, -1.77711353745745, 0.128866710402714, 
                            -2.41118134931725, -1.78305563078752, -0.0173287724390305, 
                            -0.909408846416724)), .Names = c("lat", "lon", "C"), row.names = c(NA, 
                                                                                               -10L), class = "data.frame")

您可以使用以下命令為df1創建列C

ifelse(df1[,'lat'] %in% df2[,'lat'] & df1[,'lon'] %in% df2[,'lon'],df2$C,NA)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM