2011-05-27 104 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