使用带有嵌套列表的查找表

Joa*_* OK 3 lookup r list nested-lists

您好,我有一堆关于水流(Q)的水文数据,我想对其进行标准化。数据存储在一个大型嵌套表中,其布局如下我需要保留的

Flowtestlist <- list(list("910" = data.frame( Q=c(650, 720, 550, 580, 800)),
        "950" = data.frame( Q=c(550, 770, 520, 540, 790))),
        list ("910" = data.frame( Q=c(450, 620, 750, 580, 800)),
         "950" = data.frame( Q=c(650, 750, 580, 520, 890))))
Run Code Online (Sandbox Code Playgroud)

我有级别 [[1]] 和 [[2]],实际上,我有 9 个级别,这些也是型号。在每个模型中,我有 18 个子流域,编号为 910、950、1012、1087 等(为简单起见,在上面的示例中只有两个子流域 910、950)。子流域包含有关径流 (Q) 的数据。

还有一个查找表:

test_model <- c(1,1,2,2)
test_subbasin <- c(910,950,910,950)
Q_mean <- c(870,765,823,689)
FlowtestDF <- data.frame(test_model, test_subbasin, Q_mean)
Run Code Online (Sandbox Code Playgroud)

该数据框包括每个模型和子流域参考期的流量平均值 (Q_mean)。我想从嵌套表中取出每个Q,并在查找表中找到匹配的型号和子流域,然后将其除以得到标准化的水流Q_st。

fun_st <- function(x, y=FlowtestDF) {
  x$Q_st <- x$Q/y$Q_mean
  x <- x
}

testresult <- lapply(Flowtestlist, lapply, fun_st)
Run Code Online (Sandbox Code Playgroud)

这不起作用。据我了解,该函数无法在查找表(模型和子流域)中找到所需数字的适当位置。我怎样才能做到这一点,同时保持数据的嵌套表结构?

jay*_*.sf 5

您在找这个吗?

Map(\(x, y) lapply(y[match(x$test_subbasin, names(y))], \(i) i / x$Q_mean),
    split(FlowtestDF, FlowtestDF$test_model),
    Flowtestlist)
# $`1`
# $`1`$`910`
#           Q
# 1 0.7471264
# 2 0.9411765
# 3 0.6321839
# 4 0.7581699
# 5 0.9195402
# 
# $`1`$`950`
#           Q
# 1 0.6321839
# 2 1.0065359
# 3 0.5977011
# 4 0.7058824
# 5 0.9080460
# 
# 
# $`2`
# $`2`$`910`
#           Q
# 1 0.5467801
# 2 0.8998549
# 3 0.9113001
# 4 0.8417997
# 5 0.9720535
# 
# $`2`$`950`
#           Q
# 1 0.7897934
# 2 1.0885341
# 3 0.7047388
# 4 0.7547170
# 5 1.0814095
Run Code Online (Sandbox Code Playgroud)

注意:如果您(仍然)使用 R<4.1,而不是\(x, y)使用function(x, y).