【问题标题】:Manipulating a data frame with contents from a different data frame使用来自不同数据帧的内容操作数据帧
【发布时间】:2011-05-27 12:18:17
【问题描述】:

我有一个很大的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 的程序,在每个单元格中选择地点的名称,在第二个文件中查找纬度和经度,然后将这些值填入矩阵Lat 和@987654331 @。

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)))

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    类似这样的:

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

    这样好吗?

    【讨论】:

      【解决方案2】:

      这里有一个简单的过程,可以产生你想要的东西。可能有一种方法可以在不使用 *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
      

      【讨论】:

        猜你喜欢
        • 2011-01-15
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 1970-01-01
        相关资源
        最近更新 更多