替换dplyr中的“重命名”


118

我喜欢plyr的重命名功能rename。我最近开始使用dplyr,并且想知道是否存在使用dplyr中的函数重命名变量的简便方法,该方法与plyr一样容易使用rename吗?

Answers:


148

dplyr版本0.3添加了一个新rename()功能,功能与一样plyr::rename()

df <- rename(df, new_name = old_name)

7
您能解释一下语法吗?那比命令更重要。我正在使用,rename(TheDataFrame,OldVarName=NewVarName)但是得到了Error: Unknown variables: NewVarName.,我不明白为什么。
s_a 2014年

2
@s_a我已经添加了说明。审查后应显示出来。
瑞安2014年

4
如果遇到问题,也许明确指定软件包会有所帮助dplyr::rename(iris, petal_length = Petal.Length)
布尔恩

2
快速观察两个:必须将上面的命令分配给数据框才能生效,iris <- dplyr::rename(iris, petal_length = Petal.Length)而named()不能处理带空格的变量名,例如,dplyr::rename(iris, petal_length = "petal length")产生错误。
Anthony Simon Mielniczuk

2
setNames()如果要替换批发的列名,可以使用:df %>% mutate(foo = 1 +2) %>% setNames(c("blah", "blu", "bar"))
crazybilly

46

dplyr的下一版本将支持select的改进版本,该版本还包含重命名:

> mtcars2 <- select( mtcars, disp2 = disp )
> head( mtcars2 )
                  disp2
Mazda RX4         160
Mazda RX4 Wag     160
Datsun 710        108
Hornet 4 Drive    258
Hornet Sportabout 360
Valiant           225
> changes( mtcars, mtcars2 )
Changed variables:
      old         new
disp  0x105500400
disp2             0x105500400

Changed attributes:
      old         new
names 0x106d2cf50 0x106d28a98

2
仅供参考changes(FYI )出口(或应该出口)
hadley 2014年

2
真好 唯一的一点是,这将意味着用户的部分思维的转变,因为plyr的重命名功能的使用"old"="new",而dplyr使用new=old它不会把它与的dplyr的其余功能一致。就我个人而言,我不认为这是一个问题-您很快就习惯了新事物,尤其是当这意味着您的数据处理速度大大提高时。
vergilcw 2014年

3
这是预期的功能,因此是动词的选择select。不确定我们是否有说要选择所有变量并顺便重命名此列的内容。
罗曼·弗朗索瓦

1
也许是避免混淆,您可以编辑帖子以使代码反映select实际行为方式吗?我将投票表决一种dplyr保留所有变量并仅重命名一两个变量的简便方法。:)现在,我将继续加载plyr和使用rename
vergilcw 2014年

2
@RomainFrancois @aaronwolen您可以实现OP想要的功能mtcars %>% select(matches(".*"),disp2=disp)。我希望有一个更简单的解决方案,但这可以工作并保留所有列(尽管不是它们的顺序)。 disp不会重复。
法恩西

27

实际上,您可以将plyrrename功能用作dplyr链的一部分。我认为a)将a data.frame作为第一个参数,b)的每个函数都返回一个data.frame用于链接的作品。这是一个例子:

library('plyr')
library('dplyr')

DF = data.frame(var=1:5)

DF %>%
    # `rename` from `plyr`
    rename(c('var'='x')) %>%
    # `mutate` from `dplyr` (note order in which libraries are loaded)
    mutate(x.sq=x^2)

#   x x.sq
# 1 1    1
# 2 2    4
# 3 3    9
# 4 4   16
# 5 5   25

更新:当前版本的dplyr支持直接将重命名作为该select函数的一部分(请参见上面的Romain Francois帖子)。关于将非dplyr函数用作dplyr链的一部分的一般说明仍然有效,并且rename是一个有趣的示例。


5
在这种情况下,最好在plyr 之后加载dplyr 。这样,在可用时将使用更快的dplyr函数,并且您可以使用mutate而不是dplyr :: mutate
Vincent

看起来可以在链中使用非dplyr函数是正确的。mtcars%。%named(c(“ mpg”,“ cyl”),c(“ mympg”,“ mycyl”)))在我的答案中定义了重命名功能的地方。
文森特

我更改了dplyr和plyr的加载顺序,谢谢。
user2503795 2014年

这是一个不错的解决方法,尽管引发了有关大数据性能的有趣讨论,这是dplyr的主要优点之一。谢谢你的建议!
vergilcw 2014年

确实通过引用重命名工作(例如data.table包中的
setnames)

9

尚未在dplyr中将该功能列出为功能:http://cran.rstudio.org/web/packages/dplyr/dplyr.pdf

如果您不想同时加载plyr和dplyr,则下面的函数(几乎)可以正常工作

rename <- function(dat, oldnames, newnames) {
  datnames <- colnames(dat)
  datnames[which(datnames %in% oldnames)] <- newnames
  colnames(dat) <- datnames
  dat
}

dat <- rename(mtcars,c("mpg","cyl"), c("mympg","mycyl"))
head(dat)

                  mympg mycyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4          21.0     6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag      21.0     6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710         22.8     4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive     21.4     6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout  18.7     8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant            18.1     6  225 105 2.76 3.460 20.22  1  0    3    1

编辑:Romain的注释产生以下内容(请注意,changes功能需要dplyr .1.1)

> dplyr:::changes(mtcars, dat)
Changed variables:
          old         new        
disp      0x108b4b0e0 0x108b4e370
hp        0x108b4b210 0x108b4e4a0
drat      0x108b4b340 0x108b4e5d0
wt        0x108b4b470 0x108b4e700
qsec      0x108b4b5a0 0x108b4e830
vs        0x108b4b6d0 0x108b4e960
am        0x108b4b800 0x108b4ea90
gear      0x108b4b930 0x108b4ebc0
carb      0x108b4ba60 0x108b4ecf0
mpg       0x1033ee7c0            
cyl       0x10331d3d0            
mympg                 0x108b4e110
mycyl                 0x108b4e240

Changed attributes:
          old         new        
names     0x10c100558 0x10c2ea3f0
row.names 0x108b4bb90 0x108b4ee20
class     0x103bd8988 0x103bd8f58

3
唯一的问题是复制了数据。如果这是为了玩,没什么大不了的,例如,mtcars等等。但是如果您处理大量数据,那将是非常戏剧性的。检查dplyr:::changes(mtcars, dat)
Romain Francois

1
感谢您的评论罗曼。是否有原因未从dplyr导出更改?似乎很有用。
文森特

1
我想hadley大多将其视为我们的开发工具。
罗曼·弗朗索瓦

1
它肯定应该被导出。我可能只是忘记了
hadley 2014年

2

虽然不完全重命名,dplyr::select_all()但可用于重新格式化列名。本示例用下划线替换空格和句点,并将所有内容转换为小写:

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

1

我尝试使用dplyr :: rename,但出现错误:

occ_5d <- dplyr::rename(occ_5d, rowname='code_5d')
Error: Unknown column `code_5d` 
Call `rlang::last_error()` to see a backtrace

相反,我使用了基本的R函数,事实证明它非常简单和有效:

names(occ_5d)[1] = "code_5d"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.