R 使用data.table对分组数据进行插值

R 使用data.table对分组数据进行插值,r,interpolation,data.table,linear-interpolation,R,Interpolation,Data.table,Linear Interpolation,这是我最初发布的一个问题的延续 . 马修建议我把问题贴在这里,所以我现在就这么做 以下是我的意见: 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 <

这是我最初发布的一个问题的延续 . 马修建议我把问题贴在这里,所以我现在就这么做

以下是我的意见:

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
这是函数
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
有什么建议吗?多谢各位

    site_no     V1  
1: 02446500     9.99
2: 02467000     75.66
更新1:

休,我过去使用过近似函数,它对我的数据不准确;但是,
pracma
中的
interp1
函数是准确的。
aimsall
中的
mean
p50
列以及
tempsbigdata
中的
x
值均为放电值。
tempsbigdata
中的
y
表示量规高度。我正在使用
interp1
功能来确定适当的计量高度或排放值的
y
值或
平均值(和
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

Frank,谢谢你,我已经添加了代码,使R中的数据更容易获得。Pracma是一个数值方法例程的R包,从GNU倍频程[类似于MATLAB(R)]移植到R。interp1
函数是一个一维插值函数

弗兰克,这太完美了(你最后一次评论“做事情”的R代码):


我不明白你在找什么。你有没有看过
近似值
?这个命令应该不起作用:
如果
没有右括号,并且似乎使用了一个向量参数,
aimsall$mean
,这是不可能的(与
ifelse
)相反。。。你可能想设置关键点,合并,然后做你的插值工作:
tempsbigdata[aimsmall][,if(mean[1]>min(x)){do stuff},by=site\u no]
?啊,我不知道如何得到确切的结果,但我可以试试。也许你可以?我想我在想“做些什么”步骤会利用合并:
interp1(x,y,mean[1],method=“linear”)
或类似方法。我自己对功能或pracma软件包不熟悉。酷。很高兴它成功了!感谢您提供生成示例的命令。我想问题是您试图使用
$x
语法引用变量,而不仅仅是
x
。如果您阅读了
j
和合并如何在
data.table
中工作,我认为这会更有意义。干杯。再次感谢你的建议和建议。我很高兴它也成功了!欢迎发布命令。我将阅读j和data.table中的合并@直率的
 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