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