【问题标题】:R combining assign, colnames, inside for- loopR 在 for- 循环中结合了assign、colnames
【发布时间】:2014-02-07 12:08:22
【问题描述】:

一位 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=""))))
    }

我的结论:我不明白组合assign和colnames的正确方法, 如果有人建议我如何启动并运行它,那就太好了。

到目前为止,我搜索了:R 在 for 循环中结合了 assign 和 colnames,R 使用 assign 和 colnames,R 使用 for 循环命名数据,... 但不幸的是,我没能推断出我的问题的解决方案。

【问题讨论】:

    标签: r for-loop naming assign


    【解决方案1】:

    以下是一个函数,默认情况下,它将获取父环境中名称以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),甚至可能是@ 987654326@(尽管您必须使用替代品,这样做的明智性值得怀疑)。

    更一般地说,如果您有多个相关对象将对其执行相关分析(例如,在本例中修改列),您应该真正考虑将它们存储在列表中而不是顶层。如果您这样做,那么您可以轻松地使用内置的*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]]})
    

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 2017-10-31
      • 2021-12-19
      • 1970-01-01
      • 2022-07-05
      • 2018-12-23
      • 2021-09-15
      • 2019-10-09
      • 1970-01-01
      相关资源
      最近更新 更多