【问题标题】:Maintaining the order of a vector when applying it to setNames of a list将向量应用于列表的 setNames 时保持向量的顺序
【发布时间】:2015-02-24 13:22:56
【问题描述】:

以下数据框:

df <- data.frame(matrix(rnorm(9*9), ncol=9))
names(df) <- c("c_1", "d_1", "e_1", "a_p", "b_p", "c_p", "1_o1", "2_o1", "3_o1")
row.names(df) <- names(df)

...根据“_”之后的常见索引按行名拆分,我将数据帧从列表中释放到全局环境:

list_all <- split(df,sub(".+_","",rownames(df)))
list2env(list_all,envir=.GlobalEnv)

我的许多数据框现在都有数字名称,并且无法轻松寻址,所以我想更改它们的名称。我想在每个名字中添加“df_”,但由于我不知道该怎么做,所以有人告诉我 make.names 可能很好。我创建了一个包含所有唯一索引的向量,并将其分解,我认为它可以保持索引的原始顺序:

indx <- gsub(".*_", "", names(df))
indx1 <- factor(indx, levels=unique(indx))
new.names <- make.names(unique(indx1))
new.names
[1] "X1" "p"  "o1"

new.names 按我想要的顺序排列。我将新名称应用于列表,并将其发布到环境中 list_all

现在,数字名称添加了一个前导 X(很好!),但是数据帧的顺序已经改变并且名称被错误地分配(数据帧 p 现在包含所有带有“o1”的行,反之亦然)。

  • 问题:
    1. 是否有一种简单的方法可以将字符串添加到工作区中同一类的对象名称中?
    2. 如果我要使用 make.names 路由,我怎样才能绝对确保 list_all 中的向量在 与 new.names 中的顺序相同吗?

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    为什么不直接使用,就在创建list_all之后:

    names(list_all) = paste0("df_", names(list_all))
    list2env(list_all,envir=.GlobalEnv)
    #> df_1
    #            c_1        d_1        e_1        a_p        b_p        c_p       1_o1         2_o1        3_o1
    #c_1  1.10388982 -0.2329471 -0.3330288 -2.0477186 -1.4576052  1.5411154 -0.9529714  0.289516457 -0.01017546
    #d_1 -1.02420662 -0.1002591 -0.7884373  1.5021531  0.3551084  0.7755127  0.7679464 -0.002950944 -0.69849456
    #e_1 -0.02004774 -0.1873947 -0.3674220  0.7321503  0.9076226 -0.4997974 -0.2915408 -1.376529597 -1.43563284
    

    【讨论】:

      【解决方案2】:

      这是一个我认为可以满足您需求的功能:

      # dummy data:
      x <- numeric(0)
      y <- numeric(0)
      z <- numeric(0)
      
      df1 <- data.frame()
      df2 <- data.frame()
      df3 <- data.frame()
      df4 <- data.frame()
      
      renameObjects <- function(env=.GlobalEnv, class, pfx) {  
        objs <- ls(envir = env) # get list of objects
      
        classes <- sapply(objs, function(x) class(get(x))) == class
      
        for (obj in objs[classes]) {
          assign(paste0(pfx, obj), get(obj), envir = env)
        }
        rm(list=objs[classes], envir = env)  
      }
      
      # run the function
      renameObjects(class='data.frame', pfx = 'my_prefix_')
      

      结果

      > ls()
      [1] "df1"           "df2"           "df3"           "df4"          
      [5] "renameObjects" "x"             "y"             "z"            
      > renameObjects(class='data.frame', pfx = 'my_prefix_')
      > ls()
      [1] "my_prefix_df1" "my_prefix_df2" "my_prefix_df3" "my_prefix_df4"
      [5] "renameObjects" "x"             "y"             "z" 
      

      【讨论】:

      • OP不一定要修改Global envrionment中所有data.frame的名称,而只是修改list_all中的名称。
      猜你喜欢
      • 2014-04-01
      • 2019-12-03
      • 2016-12-04
      • 2023-01-07
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多