Интерполяция сгруппированных данных с использованием data.table

Это продолжение вопроса, который я первоначально разместил по адресу http://r.789695.n4.nabble.com/subset-between-data-table-list-and-single-data-table-object-tp4673202.html, Мэтью предложил мне опубликовать свой вопрос здесь, поэтому я делаю это сейчас.

Это мой вклад ниже:

library(data.table)
library(pracma) # for the interp1 function


 tempbigdata1 <- data.table(c(14.80, 14.81, 14.82), c(7900, 7920, 7930),   c("02437100", "02437100", "02437100"))

 tempbigdata2 <- data.table(c(9.98, 9.99, 10.00), c(816, 819, 821),  c("02446500", "02446500", "02446500"))

 tempbigdata3 <- data.table(c(75.65, 75.66, 75.67), c(23600, 23700, 23800), c("02467000", "02467000", "02467000"))

  tempsbigdata <- rbind(tempbigdata1, tempbigdata2, tempbigdata3)

  setnames(tempsbigdata,c("y", "x", "site_no"))

  setkey(tempsbigdata, site_no)

tempsbigdata
   y        x       site_no
1: 14.80    7900        02437100
2: 14.81    7920        02437100
3: 14.82    7930        02437100
4:  9.98    816         02446500
5:  9.99    819         02446500
6: 10.00    821         02446500
7: 75.65    23600       02467000
8: 75.66    23700       02467000
9: 75.67    23800       02467000


 aimsmall <- data.table(c("02437100", "02446500", "02467000"), c(3882.65, 819.82, 23742.37), c(1830.0, 382.0, 10400.0))

 setnames(aimsmall,c("site_no", "mean", "p50"))

 setkey(aimsmall, site_no)

aimsmall
    site_no     mean    p50
1: 02437100     3882.65     1830
2: 02446500     819.82      382
3: 02467000     23742.37    10400

Я использую этот код для генерации интерполированного tempsbigdata$y с использованием aimsmall$mean значения по site_no:

  meanpre <- tempsbigdata[,if(aimsmall$mean > min(tempsbigdata$x){
             interp1(tempsbigdata$x, tempsbigdata$y, 
                 xi = aimsmall$mean, method ="linear")},by=site_no]

Это вывод из функции meanpre, но это не правильно.

meanpre
    site_no        V1
1: 02437100     12.07599
2: 02437100     9.99410
3: 02437100     19.56813
4: 02446500     12.07599
5: 02446500     9.99410
6: 02446500     19.56813
7: 02467000     12.07599
8: 02467000     9.99410
9: 02467000     19.56813

Вот что я хотел бы получить:

meanpre
    site_no     V1  
1: 02446500     9.99
2: 02467000     75.66

Какие-либо предложения? Спасибо.

ОБНОВЛЕНИЕ 1:

Хью, я использовал функцию приближения в прошлом, и она не точна для моих данных; Тем не менее interp1 функция в pracma это точно. mean а также p50 столбцы в aimsmall & x значения в tempsbigdata значения разряда. y в tempsbigdata представляют высоты датчика. Я использую interp1 функция для определения соответствующей высоты датчика или y значение для значений разряда или mean (а также p50).

Фрэнк, спасибо за твой совет и предложенный код. Это вывод для вашего предложенного кода:

tempsbigdata[aimsmall][,if(mean[1] > min(x)){interp1(tempsbigdata$x,tempsbigdata$y, xi = aimsmall$mean, method ="linear")},by=site_no]


site_no       V1
1: 02446500 12.07599
2: 02446500  9.99410
3: 02446500 75.66424
4: 02467000 12.07599
5: 02467000  9.99410 
6: 02467000 75.66424

Когда я запускаю следующий код, я получаю результат ниже:

 interp1(tempsbigdata$x, tempsbigdata$y, xi = aimsmall$mean, method ="linear")


 [1] 12.07599  9.99410 75.66424

Есть ли способ получить это взамен? Спасибо.

    site_no     V1  
1: 02446500     9.99
2: 02467000     75.66

ОБНОВЛЕНИЕ 2

Фрэнк, спасибо, и я добавил код, чтобы упростить получение данных в R. Pracma - это пакет процедур числового метода R, которые были перенесены из GNU Octave [аналогично MATLAB(R)] в R. interp1 функция является одномерной интерполяционной функцией.

Фрэнк, это было прекрасно (твой последний комментарий о коде R для "do stuff"):

 tempsbigdata[aimsmall][,if(mean[1] > min(x)){interp1(x, y, xi = mean[1], method ="linear")},by=site_no]

 site_no       V1
 1: 02446500  9.99410
 2: 02467000 75.66424

0 ответов

Другие вопросы по тегам