我有两个带有列的数据集dataA和dataB:id,posX和value。这两个数据集具有不同的采样率,即,相同ID的行数不相等。我正在做一种插值:
interp <- function(coil, coilY){
n <- nrow(coil)
Y <- matrix(0,nrow = n,ncol = 1)
for (i in 1:n){
ind <- order(abs(coil[i,1]-coilY[,1]),decreasing = FALSE)[1:2]#coil[i,1] = inpos and coilY[,1]=outpos
if(coilY[ind[1],1]==coilY[ind[2],1]){
Y[i] <- (coilY[ind[1],2]-coilY[ind[2],2])/2
} else {
Y[i] <- ((coilY[ind[1],2]-coilY[ind[2],2])/(coilY[ind[1],1]-coilY[ind[2],1]))*(coil[i,1]-coilY[ind[1],1]) + coilY[ind[1],2]
}
}
return(Y)
}
问题是在上面的代码中,我假设在每次迭代中都将datA和datB的ID视为相同。
>dataA
id posX val
1 2 .4
1 3 .4
1 4 .7
>dataB
id posX val
1 1 .4
1 2 .4
1 3 .7
1 4 .8
1 5 .9
在上述情况下,我可以忽略id并进行插值。但是,当我有很多重复的ID时,如何调整interp
函数,或者如何通过在每次迭代中考虑ID 1,2,...,100的行来遍历。问题出在以下类型的数据上。
>dataA
id posX val
1 2 .4
1 3 .4
2 4 .7
..
>dataB
id posX val
1 1 .4
1 2 .4
2 3 .7
2 4 .8
2 5 .9
答案 0 :(得分:1)
我一直在研究该问题,以下解决方案对我有效:
创建列表
coil<-split(dataA$posX, dataA$id)
coilY<-split(dataB$val, dataB$id)
coilY1<-split(dataB$posX, dataB$id)
lst<-list()
循环
遍历列表并将列表的每个元素转换为矩阵,因为函数interpt
仅能处理矩阵。
for (i in 1:length(coil)){
lst[[i]]<-interp(as.matrix(coil[[i]]),cbind(as.matrix(coilY1[[i]]),as.matrix(coilY[[i]])))
}
转化
获得的答案采用列表格式,将其转换为矩阵:
ans<-as.matrix(unlist(lst))