【问题标题】:Changing and assigning new variable names with purrr::map()使用 purrr::map() 更改和分配新变量名
【发布时间】:2019-08-09 07:46:55
【问题描述】:

我刚刚开始掌握编写函数和使用 lapply / purrr::map() 使我的代码更简洁的窍门,但显然还没有完全理解它。在我当前的示例中,我想重命名 lm_robust 对象的系数名称,然后更改 lm_robust 对象以合并新名称。我目前这样做:

library(dplyr)
library(purrr)
library(estimatr)

df <- tibble(interest = rnorm(1000), maturity = runif(1000, 1, 12), genderfemale = rbernoulli(1000),
            y = 0.5*interest + 2*maturity - 3*genderfemale + rnorm(1000, sd = 0.25))

model1 <- lm_robust(y ~ interest + maturity + genderfemale, data = df, se_type = "stata")
model2 <- lm_robust(y ~ interest + I(interest^2) + maturity + genderfemale, data = df, se_type = "stata")

rename_coefficients <- function(x) {
  x$term[which(x$term == "interest")] <- "Interest Rate"
  x$term[which(x$term == "I(interest^2)")] <- "Interest Squared"
  x$term[which(x$term == "maturity")] <- "Loan Maturity"
  x$term[which(x$term == "genderfemaleTRUE")] <- "Female Borrower"

  return(x$term)
}

temp <- map(list(model1, model2), rename_coefficients)
model1$term <- temp[[1]]
model2$term <- temp[[2]]

这行得通,但在我的用例中,我有更多模型,首先将 map() 的结果分配给 temp 然后为每个模型包含 model1$term &lt;- temp[[1]] 部分,这让我很困扰。

一定有更有效的方法来做到这一点?

【问题讨论】:

    标签: r purrr


    【解决方案1】:

    我们可以通过做结合这两个步骤

    purrr::map(list(model1, model2), ~{.x$term <- rename_coefficients(.x);.x})
    
    #[[1]]
    #                Estimate Std. Error   t value Pr(>|t|) CI Lower CI Upper  DF
    #(Intercept)     -0.01957   0.020690   -0.9457   0.3445 -0.06017  0.02104 996
    #Interest Rate    0.50310   0.008145   61.7719   0.0000  0.48712  0.51909 996
    #Loan Maturity    2.00225   0.002563  781.3051   0.0000  1.99722  2.00728 996
    #Female Borrower -2.97232   0.015790 -188.2375   0.0000 -3.00331 -2.94134 996
    
    #[[2]]
    #                  Estimate Std. Error   t value Pr(>|t|) CI Lower  CI Upper  DF
    #(Intercept)      -0.016819   0.021597   -0.7787   0.4363 -0.05920  0.025563 995
    #Interest Rate     0.502921   0.008105   62.0532   0.0000  0.48702  0.518825 995
    #Interest Squared -0.002588   0.005618   -0.4606   0.6452 -0.01361  0.008436 995
    #Loan Maturity     2.002219   0.002568  779.8058   0.0000  1.99718  2.007257 995
    #Female Borrower  -2.972270   0.015799 -188.1354   0.0000 -3.00327 -2.941268 995
    

    这将返回一个带有term 更改的型号列表。


    或同样使用lapply

    lapply(list(model1, model2), function(x) {x$term <- rename_coefficients(x);x})
    

    【讨论】:

    • 更困扰我的是我必须从列表中退出每个模型的部分。结合这两个步骤仍然意味着我需要为每个模型做model1 &lt;- purrr::map(list(model1, model2), ~{.x$term &lt;- rename_coefficients(.x);.x})[[1]],不是吗?即使我每次都会保存列表以不运行地图功能:temp &lt;- purrr::map(list(model1, model2), ~{.x$term &lt;- rename_coefficients(.x);.x}) model1 &lt;- temp[[1]]
    • @philipp 为什么要将模型放在单独的对象中?你可以把它们放在一个列表中。它更容易管理,特别是如果您有很多模型。
    • 这是一个很好的观点......我实际上不需要它们在单独的对象中。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-01-01
    • 2016-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多