假设我有一个file A
与(id,x,y)
,另一个file B
与(ID, xmin, xmax,ymin,ymax)
,dim(A)~50000
和dim(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个)
我该如何表达?
感谢您的帮助
答案 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