使用来自不同数据帧的内容处理数据帧

时间:2011-05-27 12:18:17

标签: r dataframe

我有一个大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的过程,在每个单元格中选择地点的名称,在第二个文件中查找纬度和经度,并在矩阵{{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)))

2 个答案:

答案 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