Вот простая процедура, которая производит то, что вы хотите. Может быть способ сделать это без явного цикла 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