Зацикливание на дубликаты как один. - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть два набора данных dataA и dataB со столбцами: id, posX и value.Два набора данных имеют разные частоты дискретизации, т. Е. Количество строк не одинаково для одного и того же идентификатора.Я делаю своего рода интерполяцию:

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, т. Е.

>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

ВВыше сценария я могу игнорировать идентификатор и сделать интерполяцию.Тем не менее, когда у меня много повторяющихся идентификаторов, как я могу настроить функцию interp или как я могу выполнить цикл, рассматривая строки с идентификаторами 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 голосов
/ 28 ноября 2018

Я продолжал работать над проблемой, и у меня сработало следующее решение:

Создание списков

coil<-split(dataA$posX, dataA$id)
coilY<-split(dataB$val, dataB$id)
coilY1<-split(dataB$posX, dataB$id)
lst<-list()

Looping

Цикл по списку и преобразование каждого элемента списка в качестве матрицы, поскольку функция 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))
...