有没有一种方法可以基于多个变量进行线性插值?

我有一个包含多个变量和很多Na的数据框

Experiment <- c("A","A","B","C","C")
Station  <- c(1,1,2,3,4,5,3)
Depth <- c(5,20,7,50,6,40,100,15,78,92,56,87,10,60,80,150,35,25,5)
ConcA <- c(0.2,0.3,0.1,0.2,0.4,NA,0.5,0.15,0.1)
ConcB <- c(NA,NA)

df <- data.frame(Experiment,Station,Depth,ConcA,ConcB)

这些实验是在世界各地进行的,数据集实际上是巨大的。这只是数据的一个子集。如您所见,样品的深度在不同的站和实验中是不同的,并且浓度数据(ConcA和ConcB)中有很多Na

我正在尝试将深度子集到最顶50m,并针对每个基于电台的实验对每1m深度进行数据插值(即,每个实验我将以1m的间隔获取每个电台的一个剖面)。

df <- subset(df,Depth < 50) #this works

df$interp <- NA
df$interp <- approx(df$ConcA,method="linear",n = 50)#this outputs data that is incorrect

df %>%                #this works!
group_by(Experiment) %>%
mutate(interp_ConcA = na.approx(ConcA,na.rm=FALSE))    

这可以对数据进行插值,但是我如何“创建”长达50米的1米深度间隔并为每1米深度插值ConcA(而不只是对深度5、20、7等处的观测值进行插值)?因为所有采样都是在不同深度的不同位置进行的,所以我想对ConcA和ConcB进行匹配,使它们都具有1米的深度数据...

然后合并数据以获取10m间隔的平均值。

我已经尝试过了,但是我得到了很多NA

concA.mean <- df %>%
group_by(Experiment,Depth = floor(Depth/10)*10) %>%
dplyr::summarize(interp_ConcA=mean(ConcA,na.rm = TRUE ))
concA.mean 

concB.mean <- df %>%
group_by(Experiment,Depth = floor(Depth/10)*10) %>%
dplyr::summarize(interp_ConcB=mean(ConcB,na.rm = TRUE ))
concB.mean 

最终,我想绘制各个数据的分布图(即每个实验中每个站点的实际收集的浓度数据),然后在其上添加均值线以显示全球的平均分布图。

(profile <- ggplot(data=df,aes(x=ConcA,y=Depth,group=Station)) + 
geom_path(colour="grey80",size=0.3) +
geom_path(aes(x= interp_ConcA,y=Depth),inherit.aes=FALSE,colour="black",data=ConcA.mean,lwd=0.6)+
#facet_wrap(~Experiment,scales = "free_y") + scale_y_reverse() +
scale_y_reverse(breaks= seq(0,by=10)) + 
theme_bw() + scale_x_continuous(position = "top") +
ylab(""))

我在做什么错了?

我刚刚尝试关注
Linear Interpolation using dplyrR: Interpolation of NAs by group并使其适应我的代码:

谢谢!

benbene110 回答:有没有一种方法可以基于多个变量进行线性插值?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3159329.html

大家都在问