将重复项作为一个循环。

时间:2018-11-27 21:15:05

标签: r interpolation

我有两个带有列的数据集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

1 个答案:

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