【问题标题】:How do I use a function to create many vectors with different names?如何使用函数创建多个具有不同名称的向量?
【发布时间】:2021-04-23 17:36:10
【问题描述】:

问题

我想创建许多特定长度的空向量。每个向量都有一个特定的名称。

想要的结果

example <- 1:10 # my actual vector length will change occasionally

a <- vector("numeric", length(example))
a[1] <- example[1]

b <- vector("numeric", length(example))
b[1] <- example[1]
...
etc. 


a 
[1] 1 0 0 0 0 0 0 0 0 0

b
[1] 1 0 0 0 0 0 0 0 0 0

etc

尝试:

create_vectors <- function(x){
  x <- vector("numeric", length(example))
  x[1] <- example[1]
  }

x <- c("a", "b", "c") # My actual task involves many more vectors
result <- lapply(x, create_vectors)
list2env(result, .GlobalEnv)


Error in list2env(result, .GlobalEnv) : 
  names(x) must be a character vector of the same length as x

以上是人为的例子。我有我想要的向量的特定名称,例如"a" 将是 "total_demand"、"b" = "moving_parts" 等等。

【问题讨论】:

  • 为什么不将它们保存在data.frame 中?
  • 我想问题是当向量的长度发生变化时这不起作用(如问题所示)。在这种情况下,list() 可能更适合。
  • 谢谢“sindri_baldur”,你是对的。一旦我创建了一个空数据框,我的代码行数减少了 90%。请看下面我的回答。 “我的毛巾在哪里”,我希望所有向量都根据另一列的长度而变大或变小。我不需要所有向量的大小相同。抱歉没有说得更清楚。
  • 以编程方式创建不同的变量(而不是单个容器对象)几乎总是一个坏主意。你只是让你的数据更难处理。如果你走这条路,迟早你会发现自己面临如何处理给定变量名列表的数据的问题。请注意,列表可以包含不同长度的向量,因此您不限于将数据帧用作容器。

标签: r function vector


【解决方案1】:

您将需要assign 命令。这是您的函数的修订版本

create_vectors <- function(name, vector_to_pass){
  vec2 <- vector_to_pass
  varname <- paste(deparse(substitute(name)))
  assign(varname, vec2, env=.GlobalEnv)
  return(vec2)
}

以下命令应在您的全局环境中生成一个向量a,其值为example

create_vectors("a", example)

【讨论】:

    【解决方案2】:

    感谢 sindri_baldur 的评论,我意识到制作一个空数据框将是最简单的解决方案。我不需要每个向量的长度不同。对不起这些家伙,我应该花更多时间考虑这个问题。

    解决方案:

    example <- 1:10
    df <- setNames(data.frame(matrix(ncol = 5, nrow = length(example))), 
                   c("a", "b", "c", "d", "e"))
    df[1, ] <- example[1]
    df[is.na(df)] = 0
    print(df$a)
    
    [1] 1 0 0 0 0 0 0 0 0 0
    

    通过以上,我可以得到向量和数据帧。

    【讨论】:

      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      相关资源
      最近更新 更多