【问题标题】:Apply a function using each element of a data frame as an input to produce a list of data frames使用数据框的每个元素作为输入应用函数以生成数据框列表
【发布时间】:2021-03-09 16:41:44
【问题描述】:

我想知道如何应用我编写的函数来生成数据框列表output,其中包含使用CHANGING_INPUT 的不同元素应用时的函数结果。

函数写成:

function1 <- function(x = 1, y, z) {
    output <- ((1 / df1 / scalar1) * scalar2 * -scalar3 * x) + (df2 * (1 - x)) + ((1 / df1 / scalar1) * x * CHANGING_INPUT[y, z])
    output
} 

目前,该函数采用 3 个常量、两个 9x4 数据帧和另一个标量值,该值从第三个数据帧 CHANGING_INPUT 调用,使用 y 和 z 作为行和列索引。

scalar1 scalar2scalar3 分别为 5100、1.8 和 0.9

df1df2 是:

structure(list(`2011` = c(0.232760280361466, 0.232760280361466, 
0.232760280361466, 0.232760280361466), `2015` = c(0.237454196065926, 
0.237454196065926, 0.237761576836319, 0.23745419606313), `2020` = c(0.243865255342033, 
0.243865255318483, 0.244731985692455, 0.243865255272293), `2025` = c(0.250576929422025, 
0.250576929505411, 0.252051235357712, 0.250576929459351), `2030` = c(0.257591865482084, 
0.257591865458864, 0.259723510459156, 0.257591865446006), `2035` = c(0.264914318542675, 
0.264914318637383, 0.267755064442473, 0.264914318608059), `2040` = c(0.272550046096461, 
0.272550046127737, 0.276154096131385, 0.272550046096482), `2045` = c(0.280506234929875, 
0.280506234860898, 0.284930672477366, 0.280506234819098), `2050` = c(0.288791456840605, 
0.28879145675613, 0.294096688663525, 0.288791456771391)), class = "data.frame", row.names = c("iea6", 
"iea4", "rcp8", "rcp6"))
structure(list(`2011` = c(0.00014797328112216, 0.00014797328112216, 
0.00014797328112216, 0.00014797328112216), `2015` = c(0.000145048194433412, 
0.000145048194433412, 0.000144860674539145, 0.00014504819443512
), `2020` = c(0.000141234971548911, 0.00014123497156255, 0.000140734780958637, 
0.000141234971589301), `2025` = c(0.00013745200916718, 0.000137452009121439, 
0.000136648020594382, 0.000137452009146705), `2030` = c(0.000133708812332024, 
0.000133708812344077, 0.000132611415651631, 0.000133708812350751
), `2035` = c(0.000130012989065563, 0.000130012989019083, 0.000128633616965254, 
0.000130012989033475), `2040` = c(0.000126370561639201, 0.0001263705616247, 
0.000124721316404496, 0.000126370561639191), `2045` = c(0.000122786227581039, 
0.000122786227611232, 0.000120879588359291, 0.000122786227629529
), `2050` = c(0.00011926357786619, 0.000119263577901076, 0.000117112173402963, 
0.000119263577894774)), class = "data.frame", row.names = c("iea6", 
"iea4", "rcp8", "rcp6"))

CHANGING_INPUT 看起来像这样:

structure(list(low = c(0.423, 0.527, 0.714, 0.432, 0.4, 0.492, 
0.548, 0.706, 0.428, 0.612, 0.329, 0.368, 0.399, 0.26, 0.295, 
0.9, 1.044), mean = c(0.682, 0.805, 1.082, 0.736, 0.664, 1.382, 
0.924, 1.34, 0.847, 1.061, 0.46, 0.525, 0.546, 0.373, 0.429, 
1.371, 1.729), high = c(1.05, 1.155, 1.532, 1.159, 1.059, 2.615, 
1.494, 2.769, 1.75, 1.699, 0.62, 0.724, 0.715, 0.499, 0.577, 
2.009, 2.952)), row.names = c("misc_bra", "misc_chi", "misc_ind", 
"misc_eur", "misc_usa", "swch_bra", "swch_chi", "swch_ind", "swch_eur", 
"swch_usa", "strw_bra", "strw_chi", "strw_ind", "strw_eur", "strw_usa", 
"wsrc_eur", "wsrc_usa"), class = "data.frame")

我想遍历CHANGING_INPUT 的每个元素以生成一个包含 51 个数据帧的列表。当与CHANGING_INPUT 的每个元素(y 和 z 的所有组合)一起应用时,列表的每个元素都应包含函数的输出。 function1 的所有其他输入应在所有迭代中保持不变。

我知道这个问题的答案很可能是一个简单的 for 循环,但我不确定从哪里开始,因为我是 R 的初学者。

【问题讨论】:

  • 什么是scalar1(等)? df1(矩阵或框架)是什么类型的对象?如果您提供了模棱两可的数据,这将有所帮助,最好是 dput(x) 对于您使用的每个变量的输出。谢谢!
  • 嗨。抱歉,我是新手,这是我发布的第一个问题。我已听从您的建议并编辑了我的问题。我希望这对您现在更有意义。

标签: r loops


【解决方案1】:

这是一个选项。

首先,我将在function1 内向output 添加一个属性,以便在框架内,您知道起始参数是什么。这不是必需的,但我发现确定哪个输入条件导致哪个输出很容易混淆。

function1 <- function(x = 1, y, z) {
  output <- ((1 / df1 / scalar1) * scalar2 * -scalar3 * x) +
    (df2 * (1 - x)) +
    ((1 / df1 / scalar1) * x * CHANGING_INPUT[y, z])
  attr(output, "coef") <- list(x=x, y=y, z=z)
  output
}

从这里开始,我认为您只是在迭代 CHANGING_INPUT 列名和行名的每个组合,所以我将其展开:

eg <- expand.grid(rownames(CHANGING_INPUT), colnames(CHANGING_INPUT),
                  stringsAsFactors = FALSE)
eg[c(1:3, 49:51),]
#        Var1 Var2
# 1  misc_bra  low
# 2  misc_chi  low
# 3  misc_ind  low
# 49 strw_usa high
# 50 wsrc_eur high
# 51 wsrc_usa high
dim(eg)
# [1] 51  2

有了这个,我将使用Map 运行它:

results <- Map(function1, list(x = 1), eg$Var1, eg$Var2)
results[1:3]
# $x
#              2011          2015          2020          2025          2030          2035          2040          2045          2050
# iea6 -0.001008359 -0.0009884259 -0.0009624408 -0.0009366620 -0.0009111541 -0.0008859690 -0.0008611478 -0.0008367225 -0.0008127175
# iea4 -0.001008359 -0.0009884259 -0.0009624408 -0.0009366620 -0.0009111541 -0.0008859690 -0.0008611478 -0.0008367225 -0.0008127175
# rcp8 -0.001008359 -0.0009871481 -0.0009590323 -0.0009311832 -0.0009036759 -0.0008765693 -0.0008499091 -0.0008237298 -0.0007980569
# rcp6 -0.001008359 -0.0009884259 -0.0009624408 -0.0009366620 -0.0009111541 -0.0008859690 -0.0008611478 -0.0008367225 -0.0008127175
# $<NA>
#               2011          2015          2020          2025          2030          2035          2040          2045          2050
# iea6 -0.0009207487 -0.0009025476 -0.0008788203 -0.0008552812 -0.0008319895 -0.0008089926 -0.0007863280 -0.0007640248 -0.0007421055
# iea4 -0.0009207487 -0.0009025476 -0.0008788203 -0.0008552812 -0.0008319895 -0.0008089926 -0.0007863280 -0.0007640248 -0.0007421055
# rcp8 -0.0009207487 -0.0009013808 -0.0008757079 -0.0008502784 -0.0008251611 -0.0008004096 -0.0007760657 -0.0007521610 -0.0007287186
# rcp6 -0.0009207487 -0.0009025476 -0.0008788203 -0.0008552812 -0.0008319895 -0.0008089926 -0.0007863280 -0.0007640248 -0.0007421055
# $<NA>
#              2011          2015          2020          2025          2030          2035          2040          2045          2050
# iea6 -0.000763219 -0.0007481319 -0.0007284640 -0.0007089522 -0.0006896455 -0.0006705831 -0.0006517961 -0.0006333088 -0.0006151396
# iea4 -0.000763219 -0.0007481319 -0.0007284640 -0.0007089522 -0.0006896455 -0.0006705831 -0.0006517961 -0.0006333088 -0.0006151396
# rcp8 -0.000763219 -0.0007471647 -0.0007258841 -0.0007048053 -0.0006839853 -0.0006634685 -0.0006432896 -0.0006234747 -0.0006040430
# rcp6 -0.000763219 -0.0007481319 -0.0007284640 -0.0007089522 -0.0006896455 -0.0006705831 -0.0006517961 -0.0006333088 -0.0006151396
attr(results[[1]], "coef")
# $x
# [1] 1
# $y
# [1] "misc_bra"
# $z
# [1] "low"

【讨论】:

  • 感谢您的回复。非常感谢您的帮助!
  • 既然你是新来的……先别着急,慢慢来。如果/当您对某个答案解决了您的问题感到满意时,请记得回来并accept it。这不仅仅是为回答者提供代表点,它还将问题标记为已解决,这可能对后续读者有用。 (我相信)保持开放一段时间以鼓励不同/更好的答案是一种常见的策略,这很好(也是一件好事)。不急,但请记住在某个时候回来。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
相关资源
最近更新 更多