首页 > 解决方案 > 当列值不准确时如何合并两个数据框?

问题描述

我有:

  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.2, 0.1, 0.1, 0.1, 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)
    

标签: rdplyrmergeextractapproximate

解决方案


您已经构建了对连接有用的插值机制。但是您没有以正确的深度值构建它。这只是重新组织代码的问题。

从 buiding 开始Bckgd_env2,然后才计算bulk_Fe2bulk_Fe3

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

推荐阅读