列值不正确时如何合并两个数据框?

问题描述

我有

  1. 每1 m线性内插dFe_env数据并创建一个数据框(有效)
  2. 每隔30分钟提取一次“深度”(基于下沉率)(有效)
  3. 创建了“时间”列,每30分钟增加一次(有效)

我如何:

  1. 将两个数据帧合并在一起(Bckgd_env2和bulk_Fe2)。在“ bulk_Fe2”中,深度增加1m,在“ Bckgd_env2”中,深度增加0.8m。我能否获得最接近的“深度”匹配,提取该深度的dFe_env并创建一个同时包含“深度”,“时间”和dFe_env的新数据框?

    library(dplyr)
    
    Depth    <- c(0,2,20,50,100,500,800,1000,1200,1500)
    dFe_env  <- c(0.2,0.2,0.3,0.4,0.1,0.1)
    bulk_Fe <- data.frame(Depth,dFe_env)
    
    summary(bulk_Fe)
    is.data.frame(bulk_Fe)
    
    do_interp <- function(dat,Depth = seq(0,1500,by=1)) {
    out <- tibble(Depth = Depth)
    for (var in c("dFe_env")) {
    out[[var]] <- tryCatch(approx(dat$Depth,dat[[var]],Depth)$y,method="ngb",error = function(e) NA_real_)
    }
    out
    }
    
    bulk_Fe2 <- bulk_Fe %>% do(do_interp(.))
    bulk_Fe2
    summary(bulk_Fe2)
    
    D0 <- 0 #Starting depth 
    T0 <- 0 #Starting time of the experiment
    
    r <- 40 #sinking rate per day
    
    r_30min <- r/48 #sinking speed every 30 minutes (There are 48 x 30 minute intervals in 24 hours)
    
    
    days <- round(1501/(r)) #days 1501 is maximum depth
    time <- days * 24 * 60 #minutes
    
    n_steps <- 1501/r_30min
    
    Bckgd_env2 <- data.frame(Depth =seq(from = D0,by= r_30min,length.out = n_steps + 1),Time = seq(from = T0,by= 30,length.out = n_steps + 1))
    head(Bckgd_env2)
    round(Bckgd_env2,digits = 1)
    
    Bckgd_env3 <- merge(Bckgd_env2,bulk_Fe2)  
    Bckgd_env3
    
    plot(Bckgd_env2$dFe_env ~ Bckgd_env2$Depth,ylab="dFe (nmol/L)",xlab="Depth (m)",las=1)
    

解决方法

您已经建立了插值机制,这对于连接很有用。但是,您没有以正确的深度值构建它。只需重组代码即可。

从建立Bckgd_env2开始,然后才计算bulk_Fe2bulk_Fe3

bulk_Fe2 <- bulk_Fe %>% do(do_interp(.,Depth=Bckgd_env2$Depth))
Bckgd_env3 <- merge(Bckgd_env2,bulk_Fe2)