【问题标题】:How should I remove subset variable X from column names of my data?我应该如何从数据的列名中删除子集变量 X?
【发布时间】:2014-09-20 08:49:11
【问题描述】:

我从一个大文件中对数据进行了子集化,并发现 X 添加到数据的每个列名称中。我使用 write.csv 写入数据,从外部打开并手动从每一列中删除 X 并保存文件。现在,当我再次阅读此文件时,X 仍然存在于列名中。示例:X2001、X2002、X2004 等。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以在这里查看差异:

     dat1 <- read.table(text="2001 2002
     45 32
     46 35",sep="",header=TRUE) 
    

     dat2<- read.table(text="2001 2002
     45 32
     46 35",sep="",header=TRUE, check.names=FALSE)
    
    
     colnames(dat1)  #it is because by default `R` doesn't allow colnames that start with numbers
     #[1] "X2001" "X2002"
     colnames(dat2)
     #[1] "2001" "2002"
    

    我会说最好不要使用check.names=FALSE,因为

      dat2$2001
      #Error: unexpected numeric constant in "dat2$2001"
    

    当然你可以使用backticks来避免错误

      dat2$`2001`
      #[1] 45 46
    

    更新

    read.table 代码中,make.names 参数正在创建X

        if (check.names) 
        col.names <- make.names(col.names, unique = TRUE)
    

    例如:

       make.names(c("2001", "2002"), unique=TRUE)
       #[1] "X2001" "X2002"
    

    【讨论】:

    • 但是这个解决方案是临时的(仅用于读取文件)。我怎样才能永久解决这个问题。这样我就不需要每次读取文件时都使用 check.names 了吗?
    • @Gaurav Chawla 使用check.names 是最直接的方法。我不知道你说的永久解决是什么意思?
    • 永久意味着正如我在问题详细信息中所述/描述的那样。即使我尝试手动(外部)删除 X 并保存文件,它仍然读取 X(不使用 check.names)
    • @Gaurav Chawla 在这种情况下,您必须更改read.table 的代码,因为check.names 使用make.names。不过,我不明白为什么在 read.table 中传递 check.names 参数如此困难?
    【解决方案2】:

    Guarav,如果您不想一直设置check.names,请包装read.table(我不建议修改read.table 代码本身)。

    read.table.raw.names <- function(...) {
       args <- list(...)
       if ("check.names" %in% names(args)) stop("Function does not require check.names to be set")
       read.table(...,check.names=F)
    } 
    

    然后,按照akrun的例子

    dat1 <- read.table.raw.names(text="2001 2002
    45 32
    46 35",sep="",header=TRUE)
    
    colnames(dat1)
    #[1] "2001" "2002"
    

    【讨论】:

    • +1,看来 OP 想要少打字。在这种情况下,包装函数的名称可以更短。
    猜你喜欢
    • 2021-06-23
    • 2012-11-03
    • 2023-03-11
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多