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

时间:2019-11-05 13:22:23

标签: r dplyr interpolation zoo mutate

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

Experiment <- c("A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C")
Station  <- c(1, 1, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 2, 3)
Depth <- c(5, 20, 7, 50, 6, 20, 40, 100, 15, 20, 78, 92, 15, 56, 87, 10, 60, 80, 150, 10, 15, 35, 7, 25, 5)
ConcA <- c(0.2, 0.3, 0.1, 0.2, 0.1, 0.3, 0.4, NA, 0.2, 0.4, 0.3, 0.2, 0.3, 0.1, 0.1, 0.2, 0.5, 0.4, 0.4, NA, 0.15, NA, 0.4, 0.4, 0.1)
ConcB <- c(NA, 0.2, 0.4, 0.1, 0.1, 0.2, 0.4, 0.3, 0.1, 0.2, 0.3, 0.1, 0.1, 0.2, 0.2, 0.1, 0.3, 0.4, 0.3, 0.2, 0.3, 0.2, 0.4, 0.4, 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, Station, Depth = floor(Depth/10)*10) %>%
dplyr::summarize(interp_ConcA=mean(ConcA, na.rm = TRUE ))
concA.mean 

concB.mean <- df %>%
group_by(Experiment, Station, 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, 50,by=10)) + 
theme_bw() + scale_x_continuous(position = "top") +
ylab(""))

我在做什么错了?

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

谢谢!

0 个答案:

没有答案