在dplyr中替换"重命名"

ver*_*lcw 110 r rename dplyr

我喜欢plyr的重命名功能rename.我最近开始使用dplyr,并想知道是否有一种简单的方法可以使用dplyr中的函数重命名变量,这对于plyr来说是否易于使用rename?

aar*_*len 140

dplyr版本0.3添加了一个新rename()功能,就像plyr::rename().

df <- rename(df, new_name = old_name)
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下语法吗?这比命令更重要.我正在使用`rename(TheDataFrame,OldVarName = NewVarName)`但我得到`错误:未知变量:NewVarName`我不明白为什么. (7认同)
  • 如果你有问题,可能明确指定包有助于`dplyr :: rename(iris,petal_length = Petal.Length)`. (4认同)
  • @s_a我添加了澄清.它应该在审查后显示出来. (2认同)
  • 两个快速观察:必须将上述命令分配给数据帧才能生效 `iris &lt;- dplyr::rename(iris, petal_length = Petal.Length)` 并且 rename() 不处理带有空格的变量名,例如, `dplyr::rename(iris, petal_length = "petal length")` 产生错误。 (2认同)
  • 你可以使用`setNames()`如果你要更换列名:`df%>%mutate(foo = 1 + 2)%>%setNames(c("blah","blu","bar") )` (2认同)

Rom*_*ois 47

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
Run Code Online (Sandbox Code Playgroud)

  • 这是预期的功能,因此可以选择动词`select`.不确定我们有什么东西说选择所有变量,顺便重命名这个列. (3认同)
  • FYI`change`被导出(或应该是) (2认同)
  • 尼斯.唯一的问题是这意味着用户的思维转变,因为`plyr`的重命名功能使用`"old"="new"`而``dplyr`使用`new = old`,这使得它与其余的dplyr函数.就个人而言,我并不认为这是一个问题 - 你会很快习惯新事物,特别是当它意味着你的数据处理速度显着提高时. (2认同)
  • @RomainFrancois @aaronwolen你可以使用`mtcars%>%select(matches(".*"),disp2 = disp)`来实现OP想要的.我会喜欢一个更简约的解决方案,但这可以保留所有列(虽然不是他们的顺序).`disp`不会重复. (2认同)

use*_*795 27

实际上,你可以使用plyr的rename功能的一部分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
Run Code Online (Sandbox Code Playgroud)

更新:当前版本的dplyr支持直接重命名为select函数的一部分(请参阅上面的Romain Francois帖子).关于使用非dplyr函数作为dplyr链的一部分的一般声明仍然有效,但这rename是一个有趣的例子.

  • 在这种情况下,最好在*plyr之后加载dplyr*.这样就可以使用更快的dplyr函数,你可以使用mutate而不是dplyr :: mutate (5认同)

Vin*_*ent 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
Run Code Online (Sandbox Code Playgroud)

编辑:Romain的注释产生以下内容(请注意,更改功能需要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
Run Code Online (Sandbox Code Playgroud)

  • 这里唯一的问题是数据被复制.没有什么大不了的,如果这是为了播放,即`mtcars`等......但如果你处理大量数据则相当戏剧性.检查`dplyr ::: changes(mtcars,dat)` (3认同)