2011-05-27 44 views
0

我有一個很大的data.frame與地理名稱(mydata)。這些地點出現在data.frame多個單元格中。使用來自不同數據幀的內容處理數據幀

在具有3列的其他文件中,我包含所有這些地方(第一列),這些地方的緯度(第二地點出現在data.frame以上的多個單元格中)。在另一個有3列的文件中,我有所有這些地方(第一列),這些地方的緯度(第二列)和第三列的經度。

我想創建其他兩個矩陣(LatLong)與尺寸等於 的data.frame與地理場所,使得尺寸:

Lat[i,j] = Latitude of the place in mydata[i,j] 
long[i,j]= longitude of the place in mydata[i,j] 

所以我要尋找一個過程,通過去mydata,選取每個單元格中的地點名稱,在第二個文件中查找緯度和經度,並將這些值填入矩陣LatLong

mydata <- data.frame(cbind(c("xyz","ab","yabc",NA)), 
          c("xyz","xyz","yabc","ab")), 
          c("ab","ab",NA,"yabc"))) 
Coor <- data.frame(cbind(c("ab","xyz","yabc"), 
          c(31.34,42.15,36.98), 
          c(12.87,13.67,18.56))) 

我想一個方法來獲得

Lat <- data.frame(cbind(c(42.15,31.34,36.98,NA), 
         c(42.15,42.15,36.98,31.34), 
         c(31.34,31.34,NA,36.98))) 

回答

2

事情是這樣的:

Lat<-do.call(cbind, lapply(mydata, function(curcol){ Coor[match(curcol, Coor[,1]), 2] })) 

,可以嗎?

+0

它完美的作品,非常感謝 – Ramon 2011-05-29 16:36:56

1

這裏有一個簡單的程序來生產你想要的。如果沒有使用*apply和索引的明確for循環,可能有辦法做到這一點,但這是可讀的。

#Define columns explicitly, avoiding cbind and the resulting coercion to characters 
mydata <- data.frame(X1=c("xyz","ab","yabc",NA),X2= c("xyz","xyz","yabc","ab"), X3=c("ab","ab",NA,"yabc")) 
Coor <- data.frame(X1=c("ab","xyz","yabc"),X2=c(31.34,42.15,36.98),X3=c(12.87,13.67,18.56)) 

Lat <- data.frame(cbind(c(42.15,31.34,36.98,NA),c(42.15,42.15,36.98,31.34),c(31.34,31.34,NA,36.98))) 

#Create the new lat/long matrices to hold the result 
Lat1 <- matrix(NA,nrow=nrow(mydata),ncol=ncol(mydata)) 
Long1 <- matrix(NA,nrow=nrow(mydata),ncol=ncol(mydata)) 

for (i in 1:ncol(mydata)){ 
    Lat1[,i] <- Coor[match(mydata[,i],Coor$X1),2] 
    Long1[,i] <- Coor[match(mydata[,i],Coor$X1),3] 
} 

比較所需輸出:

Lat 
    X1 X2 X3 
1 42.15 42.15 31.34 
2 31.34 42.15 31.34 
3 36.98 36.98 NA 
4 NA 31.34 36.98 

Lat1 
     [,1] [,2] [,3] 
[1,] 42.15 42.15 31.34 
[2,] 31.34 42.15 31.34 
[3,] 36.98 36.98 NA 
[4,] NA 31.34 36.98 

而這正是該解決方案產生的Long1

Long1 
     [,1] [,2] [,3] 
[1,] 13.67 13.67 12.87 
[2,] 12.87 13.67 12.87 
[3,] 18.56 18.56 NA 
[4,] NA 12.87 18.56