更改多个列表的列表元素名称

时间:2019-07-13 21:50:21

标签: r

我想操作列表中的命名向量,并对大量相似命名的列表执行此操作。具体来说,我的列表来自glm的结果,并且我想更改coefficients列表元素的名称。

这是一个玩具示例:

model_1 <- glm(Petal.Width ~ Sepal.Length*Sepal.Width, data = iris)
model_2 <- glm(Petal.Length ~ Sepal.Length*Sepal.Width, data = iris)

对一个列表的所需操作:

names(model_1$coefficients) <- c("Constant", "Length", "Width", "Length * Width")

现在尝试对两个列表都这样做:

for (i in 1:2) {
  list_name <- paste("model", i, sep = ""),
  names(list_name$coefficients) <- c("Constant", "Length", "Width", "Length * Width")
 }

但是,这当然不起作用,因为R尝试评估名为“ list_name”的列表。我该如何评估名为变量“ list_name”的列表?

3 个答案:

答案 0 :(得分:3)

尽管以上两个答案都包含针对您的特定问题的有效解决方案,但我强烈建议您使用列表作为所有模型的容器,因为这样会使它们的整体处理更加容易。

models <- list()
models$m_1 <- glm(Petal.Width ~ Sepal.Length*Sepal.Width, data = iris)
models$m_2 <- glm(Petal.Length ~ Sepal.Length*Sepal.Width, data = iris)

coefNames <- c("Constant", "Length", "Width", "Length * Width")

models <- lapply(models, function(x) {
  names(x$coefficients) <- coefNames
  x })

或在tidyverse中:

models <- map(models, ~  { 
    .$coefficients <- set_names(.$coefficients, coefNames)
. })

或者,最简单的解决方案是使用for循环:

for(i in 1:length(models)) {
    names(models[[i]]$coefficients) <- coefNames
}

或者说,您有多种型号可供选择:

selmods <- paste0("m_", 1:2)
for(i in selmods) {
   names(models[[i]]$coefficients) <- coefNames
}

答案 1 :(得分:2)

结合使用library(tidyverse) df %>% rownames_to_column() %>% arrange(rowname) get

assign

答案 2 :(得分:2)

这也可以 assign() *:

解决
lapply(
  mget(paste0("model_", 1:2)), 
  function(x) {
    names(x$coefficients) <- c("Constant", "Length", "Width", "Length * Width")
    x
  }
)
$model_1

Call:  glm(formula = Petal.Width ~ Sepal.Length * Sepal.Width, data = iris)

Coefficients:
      Constant          Length           Width  Length * Width  
        3.9532         -0.2490         -2.2488          0.3129  

Degrees of Freedom: 149 Total (i.e. Null);  146 Residual
Null Deviance:        86.57 
Residual Deviance: 20.9   AIC: 140.1

$model_2

Call:  glm(formula = Petal.Length ~ Sepal.Length * Sepal.Width, data = iris)

Coefficients:
      Constant          Length           Width  Length * Width  
        6.3910          0.2042         -4.1994          0.5057  

Degrees of Freedom: 149 Total (i.e. Null);  146 Residual
Null Deviance:        464.3 
Residual Deviance: 57.91  AIC: 292.9

mget()通过名称在环境中搜索对象并返回对象列表。 lapply()将函数应用于每个列表元素,然后再次返回列表。


*有很多声音建议避免 assign(),例如

  • R FAQ
  • Why is using assign bad?
  • fortunes::fortune(236):“唯一应该使用分配功能的人是那些完全理解为什么您永远不应该使用分配功能的人。” -Greg Snow,R-help(2009年7月)