我想操作列表中的命名向量,并对大量相似命名的列表执行此操作。具体来说,我的列表来自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”的列表?
答案 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()
,例如
fortunes::fortune(236)
:“唯一应该使用分配功能的人是那些完全理解为什么您永远不应该使用分配功能的人。” -Greg Snow,R-help(2009年7月)