我有一个大型数据框架(称为dftot),其中包含多个环境变量列,包括深度,盐度和处理位置。相同的处理位置被多次使用。简化:
Depth<-c(1,4,33,7,8,20,12,8)
Treatment<- c("1.1", "1.2", "1.3", "2.1", "2.2", "2.3", "1.1", "1.2")
dftot<- data.frame(Depth, Treatment)
和(目前)盐度空列:
dftot[, "Salinity"] <- NA
此外,对于每个处理位置,我有一个包含深度和盐度的数据框。深度从1到40,我将在这里给出盐度随机数。对于处理1.1,它看起来像:
Depth11<- c(1:40)
Salinity11 <- c(data$newrow <- sample(40, size = nrow(data), replace = TRUE)
tr11<- data.frame(Depth11, Salinity11)
我需要的是一段代码,它为dftot中的每个处理选择相应的处理数据框,并根据相应的深度将该处理数据框的盐度值填充到dftot中的空盐度列中。
由于我必须对多次治疗这样做,我认为最好有某种循环。但如果这是不可能的,我也可以运行每个处理的代码。
如果有人能帮助我,我将不胜感激!这里有一种可能的方法,使用一些为trXX数据制作的样例数据。
# create some sample data
Depth<-c(1,4,33)
Treatment<- c("1.1", "1.2", "1.3")
dftot <- data.frame(Depth, Treatment)
set.seed(123)
tr11 <- data.frame(Depth = 1:40, Salinity = sample(1:100, 40))
tr12 <- data.frame(Depth = 1:40, Salinity = sample(1:100, 40))
tr13 <- data.frame(Depth = 1:40, Salinity = sample(1:100, 40))
## now we code
library(tidyverse)
# build list of all loaded tr.. dataframes
lookup <- mget(ls()[grepl("^tr", ls())]) %>%
dplyr::bind_rows(.id = "Treatment")
# now operate
dftot %>%
# get the treamtnet into dftot
dplyr::mutate(Treatment2 = paste0("tr", gsub("\.","", Treatment))) %>%
# join in data from the df.lookup
dplyr::left_join(lookup, by = c("Treatment2" = "Treatment", "Depth"))
# Depth Treatment Treatment2 Salinity
# 1 1 1.1 tr11 31
# 2 4 1.2 tr12 13
# 3 33 1.3 tr13 80