我有一个大data.frame
个地理位置名称(mydata
)。这些地方出现在data.frame
多个单元格中。
在另一个有3列的文件中,我有所有这些地方(第一列),这些地方的纬度(第二个地方出现在多个单元格的data.frame
中)。在另一个有3列的文件中,我有所有这些地方(第一列),这些地方的纬度(第二列)和第三列的经度。
我想创建维度等于的其他两个矩阵(Lat
和Long
)
具有地理位置的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
的过程,在每个单元格中选择地点的名称,在第二个文件中查找纬度和经度,并在矩阵{{1}中填充这些值}和Lat
。
Long
我想要一个方法来获取
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)))
答案 0 :(得分:2)
这样的事情:
Lat<-do.call(cbind, lapply(mydata, function(curcol){ Coor[match(curcol, Coor[,1]), 2] }))
那好吗?
答案 1 :(得分:1)
这是一个产生你想要的简单程序。如果没有使用for
和索引的显式*apply
循环,可能有一种方法可以做到这一点,但这是可读的。
#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