如何创建一个删除列名称的第一个字符的函数

时间:2016-11-23 15:16:33

标签: r

当读取列名以数字开头的.csv文件时,R有问题;它通过放置" X"来改变这些名称。作为第一个角色。

我正在尝试编写一个简单解决这个问题的函数(尽管:这是最简单的方法吗?)

作为示例文件,我只是在iris中创建了两个新的(非感性)列:

iris$X12.0 <- iris$Sepal.Length
iris$X18.0 <- iris$Petal.Length


remv.X <- function(x){
  if(substr(colnames(x), 1, 1) == "X"){
    colnames(x) <- substr(colnames(x), 2, 100)
  } 
  else{
    colnames(x) <- substr(colnames(x), 1, 100)
  }
} 

remv.X(iris)

打印时,我收到警告,没有任何变化。 我做错了什么?

1 个答案:

答案 0 :(得分:3)

<强> check.names = FALSE

使用read.table / read.csv参数check.names = FALSE关闭列名称修改。

例如,

read.csv(text = "1x,2x\n10,20", check.names = FALSE)

,并提供:

  1x 2x
1 10 20

使用子

删除X.

如果由于某种原因你在某些列名称的开头有一个不需要的X字符,可以像这样删除它们。这仅删除列名开头的X,下一个字符是数字。如果下一个字符不是数字或者没有下一个字符,则列名保持不变。

names(iris) <- sub("^X(\\d.*)", "\\1", names(iris))

或作为一种功能:

rmX <- function(data) setNames(data, sub("^X(\\d.*)", "\\1", names(data)))

# test
iris <- rmX(iris)

有问题的代码存在问题

问题中的代码存在两个问题。

  1. if (condition) ...中,条件是向量,但必须是a 标量。

  2. 永远不会返回数据框。

  3. 这里修好了。我们还考虑了if的两条腿的LHS。

    remv.X2 <- function(x) {
      for (i in seq_along(x)) {
         colnames(x)[i] <- if (substr(colnames(x)[i], 1, 1) == "X") {
            substr(colnames(x)[i], 2, 100)
         } else {
            substr(colnames(x)[i], 1, 100)
         }
      }
      x
    } 
    
    iris <- remv.X2(iris)
    

    或者甚至可能:

    remv.X3 <- function(x) {
      setNames(x, substr(colnames(x), (substr(colnames(x), 1, 1) == "X") + 1, 100))
    } 
    
    iris <- remv.X3(iris)