R结合assign,colnames,在for循环中

时间:2014-02-07 12:08:22

标签: r for-loop naming assign

R新手再次寻求帮助。

一般情况:我目前正在创建一个脚本,每次实验都有几个数据框。 实验的时间步长和反应器数量各不相同,因此我需要 我的脚本具有二维灵活性,可以将数据“按摩”到正确的形状以进行所需的测试,并从多个数据框中绘制必要的数据。 不幸的是我选择使用for循环来解释这一点,我现在看到R中的不好做法, 但我现在已经不得不改变方向了。

问题:我尝试实现一维矩阵由对象名称命名,在for循环中,由于我想要应用的其他功能,我需要它们采用矩阵格式。

# Simple but non- flexible examples of what I want to do:

# creates two matrix objects
a1 <- matrix(c(1,2,3,4,5))
a2 <- matrix(c(1,2,3,4,5))

#names header of the objects name
colnames(a1) <- "a1"
colnames(a2) <- "a2"

这有效,但我需要它在for循环中工作...

# here are the two flexible but non- working approaches of mine

# creates two matrix objects
a1 <- matrix(c(1,2,3,4,5))
a2 <- matrix(c(1,2,3,4,5))

# should name object according to progress in loop
for(i in 1:2)
{
 assign(colnames(paste("a",i,sep="",collapse="")),do.call("c",list(paste("a",i,sep=""))))
}

这不是正确使用assign并创建错误。 第二次尝试不会创建错误但也不起作用,它会创建空对象

# creates two matrix objects
a1 <- matrix(c(1,2,3,4,5))
a2 <- matrix(c(1,2,3,4,5))

# should name object according to progress in loop
for(i in 1:2)
    {
      assign(paste("a",i,sep="", colapse=""),do.call("colnames",list(paste("a",i,sep="", colapse=""))))
    }

我的结论:我不明白组合分配和colnames的正确方法, 如果有人得到建议我如何能够启动并运行,这将是非常棒的。

我搜索的票价是:R将assign和colnames结合在for循环中,R使用assign和colnames,R使用for循环命名数据,...... 但不幸的是,我没有设法解决我的问题。

1 个答案:

答案 0 :(得分:0)

以下是一个函数,默认情况下,将采用父环境中名称以a开头,后跟数字的任何对象,检查它们是否为一个列矩阵,如果是,使用对象名称命名列。

a1 <- matrix(c(1:5))
a2 <- matrix(c(1:5))
name_cols()
a1
#      a1
# [1,]  1
# [2,]  2
# ...
a2
#      a2
# [1,]  1
# [2,]  2
# ...

以下是代码:

name_cols <- function(pattern="^a[0-9]+", env=parent.frame()) {
  lapply(
    ls(pattern=pattern, envir=env),
    function(x) {
      var <- get(x, envir=env)
      if(is.matrix(var) && identical(ncol(var), 1L)) {
        colnames(var) <- x
        assign(x, var, env)
  } } )
  invisible(NULL)
}

注意我按模式选择了规范,但您可以通过指定变量的名称(而不是使用ls,只需传递名称和lapply)来轻松更改此项,或者甚至可能是objects(虽然你必须使用替代品,但这样做的明智性会变得有问题)。

更一般地说,如果您有几个相关对象,您将在其上执行相关分析(例如,在这种情况下修改列),您应该考虑将它们存储在列表中而不是顶层。如果这样做,那么您可以轻松使用内置的*pply函数同时对所有对象进行操作。例如:

a.lst <- list(a1=matrix(1:5), a2=matrix(1:5))
a.lst <- lapply(names(a.lst), function(x) {colnames(a.lst[[x]]) <- x; a.lst[[x]]})