基于变量名称的列表元素 R

Posted

技术标签:

【中文标题】基于变量名称的列表元素 R【英文标题】:Name list elements based on variable names R 【发布时间】:2015-08-01 19:55:24 【问题描述】:

我想动态地将元素添加到一个空列表中。列表中的每个元素都应该在一组变量之后自动命名,这些变量的值会有所不同。

但是,我似乎无法找到一种方法来动态命名列表元素而不会出错。考虑下面的例子:

L <- list()

var1 <- "wood"
var2 <- 1.0
var3 <- "z4"

varname <- paste(var1, as.character(var2), var3, sep="_")

# This works fine:
L$"wood_1_z4" <- c(0,1)
L$"wood_1_z4"
0 1

# This doesn't!!
L$paste(var1, as.character(var2), var3, sep="_") <- c(0,1)
Error in L$paste(var1, as.character(var2), var3, sep = "_") <- c(0, 1) : 
  invalid function in complex assignment

# Ths doesn't either ... 
L$eval(parse(text = "varname")) <- c(0,1)
Error in L$eval(parse(text = "varname")) <- c(0, 1) : 
target of assignment expands to non-language object

有没有办法做到这一点?

【问题讨论】:

使用[[:L[[paste(var1, as.character(var2), var3, sep="_")]]&lt;-c(0,1) 如果给names(L)赋值呢? $ 不对右侧进行任何评估,因此会出现错误。 【参考方案1】:

您不能使用&lt;- 运算符分配给paste()(我相信eval() 函数也是如此)。相反,您需要使用[[ 运算符或使用names() 函数。你可以这样做:

L <- list()
var1 <- "wood"
var2 <- 1.0
var3 <- "z4"
varname <- paste(var1, as.character(var2), var3, sep="_")

# Using [[
L[[varname]] <- c(0,1)

> L
$wood_1_z4
[1] 0 1

# Using names()
L[[1]] <- c(0,1)
names(L)[1] <- varname

> L
$wood_1_z4
[1] 0 1

一种更有效的方法可能是使用一个既创建值又命名列表元素的函数,或者甚至只创建值的函数 - 如果您随后使用sapply,您可以使用以下方式命名每个列表元素调用函数的参数和USE.NAMES 选项。

在一般意义上,当列表的最终大小和结构不为人所知时,R 并没有针对随着时间的推移而不断增长的列表进行优化。虽然可以做到,但更“R-ish”的方法是提前弄清楚结构。

【讨论】:

虽然您确实不能分配给pasteeval,但它不起作用的原因是因为原语$ 没有在右侧进行评估.根据$ 的 C 代码中的 cmets:“我们需要确保只评估第一个参数。第二个将是一个需要匹配的符号,而不是评估。”跨度> 【参考方案2】:

另一种方法是使用来自stats 包的包装器setNames(),如下所示:

var1 <- "wood"
var2 <- 1.0
var3 <- "z4"
varname <- paste(var1, as.character(var2), var3, sep="_")

L <- setNames(list(c(0, 1)), varname)

> L
$wood_1_z4
[1] 0 1 

【讨论】:

【参考方案3】:

使用 `namesc() 将其与列表 L 连接起来。此单行可用于根据要求继续向 L 'on the fly' 添加元素。

L <- list()
var1 <- "wood"
var2 <- 1.0
var3 <- "z4"
varname <- paste(var1, as.character(var2), var3, sep="_")

L <- c(L, `names<-`(list(c(0, 1)), varname))

L
#> $wood_1_z4
#> [1] 0 1

【讨论】:

以上是关于基于变量名称的列表元素 R的主要内容,如果未能解决你的问题,请参考以下文章

R语言怎么判断一个变量是不是包含另一个变量的元素?

如何从 R 中的 netCDF 文件中提取变量名?

r 将列表名称与列表级别组合以模仿R中的摘要(lm(...))对象的系数输出(也称为smushed变量名称)

R:基于分类变量*列表*创建虚拟变量[重复]

在 R 中添加一个包含每个 FINAL 列表(在列表列表中)名称的变量

如何从 R 中的 GLM 调用中检索原始变量名称的列表?