【问题标题】:R, combine vectors having sequential namesR,组合具有顺序名称的向量
【发布时间】:2023-04-07 09:54:01
【问题描述】:

我想堆叠具有连续名称的向量。

例如,我有

a1<-1:3
a2<-4:6
a3<-7:9

我知道我能帮你

z<-as.vector(rbind(a1,a2,a3))

如果我有 100 个 as、a1、a2、a3、...、a100,我该怎么做?

谢谢!

【问题讨论】:

  • 你的预期输出是什么?

标签: r vector stack


【解决方案1】:

您可以使用get() 访问变量。 您的示例将如下所示:

a_list <- list()
for(i in 1:3){
    a_list[[i]] <- get(paste0("a",i))
}

z <- as.vector(do.call("rbind",a_list))

或者使用lapply:

as.vector(do.call("rbind",lapply(1:3,function(x){get(paste0("a",x))})))

然后你可以这样做,例如i in 1:100 或任何你需要的东西。

【讨论】:

    【解决方案2】:

    我们可以使用mget。以下结果与您的示例代码相同。然后您可以将1:3 更改为1:100。

    as.vector(matrix(unlist(mget(paste0("a", 1:3))), ncol = 3, byrow = TRUE))
    [1] 1 4 7 2 5 8 3 6 9
    

    【讨论】:

    • 很好,我不知道mget。
    【解决方案3】:

    如果您将它们全部作为列表 'lst' 的成员,那么您可以简单地调用 do.call(rbind,lst) 或 do.call(c, lst) - 甚至是 unlist(lst)。所以诀窍是将变量放入列表中。您可以使用 'ls' 返回所需变量的名称,然后对这些名称使用 mget:

    do.call(c, mget(ls(pattern="a[0-9]+")))

    其中模式是一个正则表达式,用于查找全局环境中所有 a123 形式的变量。

    【讨论】:

    • 谢谢..当我这样做时,'what'必须是一个函数或字符串,消息出来了。你能帮我多一点吗?
    • 'c' 通常是一个函数,所以你可能重新定义了它?试试 do.call(rbind, ...) 看看是否效果更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2016-12-28
    • 2016-09-20
    相关资源
    最近更新 更多