一般情况:我目前正在创建一个脚本,每次实验都有几个数据框。 实验的时间步长和反应器数量各不相同,因此我需要 我的脚本具有二维灵活性,可以将数据“按摩”到正确的形状以进行所需的测试,并从多个数据框中绘制必要的数据。 不幸的是我选择使用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循环命名数据,...... 但不幸的是,我没有设法解决我的问题。
答案 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]]})