这是我最初在 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:
休,我过去使用过 approx 函数,它对我的数据不准确;但是,interp1
函数pracma
是准确的。mean
和中的p50
列aimsmall
和中的x
值tempsbigdata
是放电值。y
intempsbigdata
代表量规高度。我正在使用该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 代码的最后评论):
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