【问题标题】:how to rename a variable in r, using a composed name如何使用组合名称重命名 r 中的变量
【发布时间】:2017-10-10 11:54:37
【问题描述】:

我可以制作这个代码:

#set seed
set.seed(848)

#make variables (similar, not same)
myvar_a <- rnorm(n = 100, mean = 1, sd = 2)
myvar_b <- rnorm(n = 100, mean = 2, sd = sqrt(3))
myvar_c <- rnorm(n = 100, mean = 4, sd = sqrt(5))
myvar_d <- rnorm(n = 100, mean = 8, sd = sqrt(8))

#transform variables
for(i in 1:4){
     if(i ==1){
          myvar_1 <- myvar_a
     } else if (i==2) {
          myvar_2 <- myvar_b
     } else if (i==3) {
          myvar_3 <- myvar_b
     }  else {
          myvar_4 <- myvar_b
     } 
}

它给了我这个:

有没有办法用“粘贴”和循环变量来做到这一点?

在 MATLAB 中有 eval 将构造的字符串视为一行代码,因此我可以创建句子然后在代码中运行它们。

【问题讨论】:

  • 您可以在 R 的 MatLab 中执行类似的操作,但您不应该这样做。 R 是一种实际的编程语言。使用列表来存储这些变量。这将使后续步骤更容易。
  • 我在单独的文件中有一堆结果,这些结果来自我要加载的另一个程序的单独运行。它们是复杂的结构,而不是简单的数据,并且它们在加载时都具有相同的名称。当您说“列表”时,您的意思是“复杂数据结构的列表”吗? R列表像MatLab结构吗?
  • 按照 roland 的建议将它们放入一个列表中。列表是 R 中最通用的对象,每个列表元素都可以包含任何其他 R 对象,而不管另一个元素中包含什么。所以对象的复杂性是无关紧要的。如果您使用一些有序的过程来加载数据,您可以使用类似的过程来命名您的列表项。有关一些有用的提示,请参阅 gregor 对this post 的回答。
  • 动态变量命名一般来说是个坏主意,在 MATLAB 中使用evalone of the worst practises possible,尤其是这样做。

标签: r variables renaming


【解决方案1】:

你可以这样做:

for(i in 1:4){
  let <- if(i == 1) "a" else "b"
  assign(paste0("myvar_", i), get(paste0("myvar_", letters[i])))
}

但正如其他人所说,这并不是真正值得推荐的。

【讨论】:

    【解决方案2】:
    l <- list()
    
    #transform variables
    for(i in 1:4){
      if(i ==1){
        l[[paste0("myvar_", i)]] <- myvar_a
      } else if (i==2) {
        l[[paste0("myvar_", i)]] <- myvar_b
      } else if (i==3) {
        l[[paste0("myvar_", i)]] <- myvar_b
      }  else {
        l[[paste0("myvar_", i)]] <- myvar_b
      } 
    }
    
    print(l)
    

    当然,有经验的 R 用户会使用 lapply 而不是 for 循环。

    【讨论】:

    • 之后如何访问列表?获取第一个结构是否只是“l[[1]]”?
    • 另外,你能举一个使用“lapply”的例子吗?
    猜你喜欢
    • 2016-11-13
    • 2018-09-13
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多