【问题标题】:Create for loop to rename all columns of several data tables in R创建for循环以重命名R中多个数据表的所有列
【发布时间】:2015-03-31 07:28:29
【问题描述】:

我有多个以“x.y.z”形式命名的data.tables。我想创建一个 for 循环,它将重命名每个 data.tables 的列,以便每列以“x.y.column 的原始名称”开头。因为所有的 data.table 都有相似的列名,所以当我加入它们时,我想知道该列最初来自哪个 data.table。

我尝试在 setnames()/colnames() 函数中使用 paste("x","y","z",sep=".") 但它没有认识到最终结果应该是参考到现有的全局变量(data.table),而不仅仅是一个字符串。

任何帮助将不胜感激。

【问题讨论】:

    标签: r for-loop data.table rename


    【解决方案1】:

    “data.table”对象名称的“模式”不是很清楚。根据您的描述

    我有多个以“x.y.z”形式命名的data.tables。

    我创建了一些“data.table”对象('x1.y1.z'、'x1.y2.z'、..)。

    nm1 <- ls(pattern='^x.*.')
    nm1
    #[1] "x1.y1.z" "x1.y2.z" "x2.y1.z" "x2.y2.z"
    

    循环遍历对象名称(“nm1”),使用sub删除“.z”部分,获取对象名称(“colNm”),使用paste创建新名称(“newNm”) , 并用setnames 更改列名

    for(i in seq_along(nm1)){
      temp <- nm1[i]
      temp1 <- sub('..$', '', temp)
      colNm <- names(get(temp))
      newNm <- paste(temp1, colNm, sep='.')
      setnames(get(temp), colNm, newNm)
     }
    
     head(x1.y1.z,2)
     #   x1.y1.V1 x1.y1.V2 x1.y1.V3 x1.y1.V4
     #1:        6       13        2        7
     #2:        5        8       12        5
     head(x2.y1.z,2)
     #   x2.y1.V1 x2.y1.V2 x2.y1.V3 x2.y1.V4
     #1:       10       10       10        3
     #2:        8       18        5        5
    

    数据

    set.seed(24)
    x1.y1.z <- as.data.frame(matrix(sample(1:20, 10*4, replace=TRUE),ncol=4))
    x2.y1.z <-  as.data.frame(matrix(sample(1:20, 10*4, replace=TRUE), ncol=4))
    x1.y2.z <-  as.data.frame(matrix(sample(1:20, 10*4, replace=TRUE), ncol=4))
    x2.y2.z <-  as.data.frame(matrix(sample(1:20, 10*4, replace=TRUE), ncol=4))
    
    setDT(x1.y1.z); setDT(x2.y1.z); setDT(x1.y2.z); setDT(x2.y2.z)
    

    【讨论】:

    • 哇,这太棒了。太感谢了!!!!不过有一件事,你能解释一下 temp1
    • @PabloBoswell . 表示任何字符。因此,..$ 指的是字符串末尾的任意 2 个字符。在示例x1.y1.z 中,它会将.z 替换为'',所以基本上你会得到x1.y1。为什么我要替换是因为.z 部分在所有文件中都很常见(我假设它是这样的)。不过,您不必更换它)。
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2018-06-04
    • 2015-10-14
    • 2017-11-14
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多