[英]matching columns of two different data frames in R
我有兩個具有經度和緯度值的數據幀,我想從數據幀2中提取值(例如,列df2$C
,數據幀2的第三列),這些值與數據幀1的列匹配。例如,數據幀1有兩列( lon
, lat
),數據幀2有三列( lon
, lat
和一些值"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.