将双循环的结果保存在变量维

时间:2018-04-03 20:10:23

标签: r loops double

假设我有一个file A(id,x,y),另一个file B(ID, xmin, xmax,ymin,ymax)dim(A)~50000dim(B)~3000

我需要的是向A添加一个额外的列,其中每一行都是由B$ID[j]位于A$x[i]B$xmin[j]之间的所有B$xmax[j]组成的向量,同时,A$y[i]介于B$ymin[j]B$ymax[j]之间。 此向量的最小尺寸为1,最大尺寸为4。

(基本上我有一个网格,我想知道网格的哪些单元格中A的元素正在下降。它们将始终落在至少一个单元格中,最多为4个)

我该如何表达?

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

对此并不感到自豪,但它有效:

   A=data.table(id=c(1,1,1,1,1,2,2,2,2,2,2),x=c(1:5,2:7),y=c((3:7),(4:9)))
   B=data.table(ID=c(1,2),xmin=c(1,2),xmax=c(5,7),ymin=c(3,4), ymax=c(7,9))


    A$newcol <- apply(A,1,function(rowA) B$ID[apply(B,1,function(rowB)  rowA[2]>=rowB[2] & rowA[2]<=rowB[3] & rowA[2]>=rowB[4] & rowA[2]<=rowB[5])])

我将努力寻找data.table / dplyr替代方案,我希望这种替代方案更好,更通用

答案 1 :(得分:0)

你走了。我无法使用您的数据对此进行测试,但是可能会出现错误。

getIDs <- function (x, y) { 
  found <- c()
  for ( j in nrows(B) ) {
    if ( x >= B[j,"xmin"] && x <= B[j,"xmax"] &&
         y >= B[j,"ymin"] && y <= B[j,"ymax"] ) {
      found <- append(found, B[j, "ID"])
    }
  }
  return(found)
}
A$NewCol <- apply( A[, c("x", "y")], 1, function(x) getIDs(x[1], x[2]) )

我建议你在这里查看:Call apply-like function on each row of dataframe with multiple arguments from each row