【问题标题】:R: rename subset of variables in data frameR:重命名数据框中的变量子集
【发布时间】:2012-05-26 14:23:29
【问题描述】:

我正在重命名数据框中的大多数变量,但我的方法并没有给我留下深刻的印象。

因此,SO 上的任何人都有比下面介绍的仅使用 base 的方法更智能或更快的方法吗?

    data(mtcars)
  # head(mtcars)


  temp.mtcars <- mtcars
  names(temp.mtcars) <- c((x <- c("mpg", "cyl", "disp")), 
                           gsub('^', "baR.", setdiff(names (mtcars),x)))
  str(temp.mtcars)
  'data.frame': 32 obs. of  11 variables:
   $ mpg     : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
   $ cyl     : num  6 6 4 6 8 6 8 4 4 6 ...
   $ disp    : num  160 160 108 258 360 ...
   $ baR.hp  : num  110 110 93 110 175 105 245 62 95 123 ...
   $ baR.drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
   $ baR.wt  : num  2.62 2.88 2.32 3.21 3.44 ...
   $ baR.qsec: num  16.5 17 18.6 19.4 17 ...
   $ baR.vs  : num  0 0 1 1 0 1 0 1 1 1 ...
   $ baR.am  : num  1 1 1 0 0 0 0 0 0 0 ...
   $ baR.gear: num  4 4 4 3 3 3 3 4 4 4 ...
   $ baR.carb: num  4 4 1 1 2 1 4 2 2 4 ...

【问题讨论】:

  • 这是我很想用一个非常简单的答案来回答的问题你还没有完全解释清楚。
  • @joran 我怀疑原因是子集假设您的原始向量名称与对象名称的顺序正确。
  • @joran,请做。我会非常感谢一个更简单的解决方案。这就是我发布这个问题的原因。

标签: r rename base gsub


【解决方案1】:
names(df)[match(
                c('old_var1','old_var2'),
                names(df)
               )]=c('new_var1', 'new_var2')

【讨论】:

    【解决方案2】:

    您可以使用gdata 包中的rename.vars 函数。 当您只想替换变量名称的子集并且名称向量的顺序与 data.frame 中名称的顺序不同时,它很有效。

    改编自帮助文件:

    library(gdata)
    data <- data.frame(x=1:10,y=1:10,z=1:10)
    names(data)
    data <- rename.vars(data, from=c("z","y"), to=c("Z","Y"))
    names(data)
    

    转换 data.frame 名称:

    [1] "x" "y" "z"
    

    [1] "x" "Y" "Z"
    

    即,请注意这如何处理子集以及名称字符串与 data.frame 中名称的顺序不同的事实。

    【讨论】:

      【解决方案3】:

      我会使用ifelse:

      names(temp.mtcars) <- ifelse(names(mtcars) %in% c("mpg", "cyl", "disp"),
                                   names(mtcars),
                                   paste("bar", names(mtcars), sep = "."))
      

      【讨论】:

      • 我喜欢这个解决方案,因为它不会创建任何新对象。而且,它可以很容易地变成一个函数。谢谢。
      • 请注意 - 这假设您的新名称的顺序与现有名称的顺序相同。
      • @Andrie,我不确定我是否理解问题所在。我正在寻找的是一种重命名所有变量的方法,除了一个子集;我不明白订购如何成为问题。如果您能解释问题,我将不胜感激。谢谢。
      • 还要提防回收!此示例有效,因为真假条件的长度相同。如果不是,你会觉得很奇怪:stackoverflow.com/q/16110859/419842
      • 又快又脏:{r} names(mydataframe) &lt;- paste(c("foo","bar","baz")) 当然,vector的内容应该和data.frame中的名字匹配,但是你得到图片;)
      【解决方案4】:

      仅使用基本 R 编辑答案

      plyr 有一个方便的功能rename() 可以满足您的要求。您修改后的问题指定仅使用基础 R。一种简单的方法是从plyr::rename 复制代码并创建自己的函数。

      rename <- function (x, replace) {
        old_names <- names(x)
        new_names <- unname(replace)[match(old_names, names(replace))]
        setNames(x, ifelse(is.na(new_names), old_names, new_names))
      }
      

      函数rename 接受一个命名向量的参数,其中向量的元素是新名称,向量的名称是现有名称。有很多方法可以构建这样一个命名向量。在下面的示例中,我只是使用structure

      x <- c("mpg", "disp", "wt")
      some.names <- structure(paste0("baR.", x), names=x)
      some.names
             mpg       disp         wt 
       "baR.mpg" "baR.disp"   "baR.wt" 
      

      现在您可以重命名了:

      mtcars  <- rename(mtcars, replace=some.names)
      

      结果:

      'data.frame':   32 obs. of  11 variables:
       $ baR.mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
       $ cyl     : num  6 6 4 6 8 6 8 4 4 6 ...
       $ baR.disp: num  160 160 108 258 360 ...
       $ hp      : num  110 110 93 110 175 105 245 62 95 123 ...
       $ drat    : num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
       $ baR.wt  : num  2.62 2.88 2.32 3.21 3.44 ...
       $ qsec    : num  16.5 17 18.6 19.4 17 ...
       $ vs      : num  0 0 1 1 0 1 0 1 1 1 ...
       $ am      : num  1 1 1 0 0 0 0 0 0 0 ...
       $ gear    : num  4 4 4 3 3 3 3 4 4 4 ...
       $ carb    : num  4 4 1 1 2 1 4 2 2 4 ...
      

      【讨论】:

      • 感谢您回答我的问题。问题是您的解决方案添加了后缀,而不是前缀。另外,我正在寻找仅使用基础的解决方案。
      • 谢谢,唯一的问题是您的最新函数重命名了选定的变量,而不是其余的变量。此外,它重新排序数据,但谢谢。感谢您抽出宝贵的时间。
      【解决方案5】:

      几乎相同,但没有plyr

      data(mtcars)
      
      temp.mtcars <- mtcars
      
      carNames <- names(temp.mtcars)
      modifyNames <- !(carNames %in% c("mpg", "cyl", "disp"))
      
      names(temp.mtcars)[modifyNames] <- paste("baR.", carNames[modifyNames], sep="")
      

      输出:

      str(temp.mtcars)
      'data.frame':   32 obs. of  11 variables:
      $ mpg     : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
      $ cyl     : num  6 6 4 6 8 6 8 4 4 6 ...
      $ disp    : num  160 160 108 258 360 ...
      $ baR.hp  : num  110 110 93 110 175 105 245 62 95 123 ...
      $ baR.drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
      $ baR.wt  : num  2.62 2.88 2.32 3.21 3.44 ...
      $ baR.qsec: num  16.5 17 18.6 19.4 17 ...
      $ baR.vs  : num  0 0 1 1 0 1 0 1 1 1 ...
      $ baR.am  : num  1 1 1 0 0 0 0 0 0 0 ...
      $ baR.gear: num  4 4 4 3 3 3 3 4 4 4 ...
      $ baR.carb: num  4 4 1 1 2 1 4 2 2 4 ...
      

      【讨论】:

      • 保重。此解决方案假定您的名称与您正在重命名的对象中的顺序相同。
      • 感谢您回答我的问题。
      猜你喜欢
      • 1970-01-01
      • 2018-11-09
      • 2016-03-04
      • 2012-06-28
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      相关资源
      最近更新 更多