替换为;更名为;在dplyr中

替换为;更名为;在dplyr中,r,rename,dplyr,R,Rename,Dplyr,我喜欢plyr的重命名功能rename。我最近开始使用dplyr,我想知道是否有一种简单的方法可以使用dplyr中的函数重命名变量,这与plyr的重命名?一样容易使用。它在dplyr中没有作为函数列出(目前): 如果您不想同时加载plyr和dplyr,则下面的函数的工作原理(几乎)相同 rename <- function(dat, oldnames, newnames) { datnames <- colnames(dat) datnames[which(datnames

我喜欢plyr的重命名功能
rename
。我最近开始使用dplyr,我想知道是否有一种简单的方法可以使用dplyr中的函数重命名变量,这与plyr的
重命名

一样容易使用。它在dplyr中没有作为函数列出(目前):

如果您不想同时加载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

实际上,您可以使用
plyr
rename
函数作为
dplyr
链的一部分。我认为每个函数a)以a
data.frame
作为第一个参数,b)返回a
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
是一个有趣的例子。

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
>mtcars2头部(mtcars2)
disp2
马自达RX4160
马自达RX4 Wag 160
Datsun 710108
大黄蜂4路258号
大黄蜂360
英勇的225
>变更(mtcars、mtcars2)
已更改的变量:
新旧
显示0x105500400
disp2 0x105500400
更改的属性:
新旧
名称0x106d2cf50 0x106d28a98

dplyr 0.3版添加了一个新的
rename()
函数,其工作原理与
plyr::rename()
类似


df虽然不完全重命名,
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

我试图使用dplyr::rename,但出现了一个错误:

occ_5d <- dplyr::rename(occ_5d, rowname='code_5d')
Error: Unknown column `code_5d` 
Call `rlang::last_error()` to see a backtrace
dplyr>=1.0.0 除了更新版本的
dplyr::rename
之外,dplyr

rename_with()使用函数重命名列

可以使用
.cols
参数在一组列上应用函数:

iris %>% 
  dplyr::rename_with(.fn = ~ gsub("^S", "s", .), .cols = where(is.numeric))

    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
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
5            5.0         3.6          1.4         0.2     setosa


在这种情况下,最好在plyr之后加载dplyr。这样,在可用时可以使用更快的dplyr函数,并且您可以使用mutate而不是dplyr::mutateLooks,就像您在链接中使用非dplyr函数是正确的一样。mtcars%。%重命名(c(“mpg”、“cyl”)、c(“mympg”、“mycyl”))在重命名是我的答案中定义的函数的情况下工作。我更改了dplyr和plyr的加载顺序,谢谢。这是一个不错的解决方法,尽管它带来了一个关于更大数据性能的有趣讨论,这是dplyr的主要优势之一。谢谢你的建议!是否通过引用重命名工作,如data.table Package中的集合名这里唯一的问题是复制数据。如果这是为了玩,也没什么大不了的,例如
mtcars
等。。。但是如果你处理大量的数据,这是非常戏剧性的。检查
dplyr:::更改(mtcars,dat)
谢谢您的评论。是否存在无法从dplyr导出更改的原因?似乎是一个非常有用的功能。我猜hadley主要把它看作是我们的一个开发工具。它肯定应该被导出。我可能刚刚忘记了,fyi
更改
导出(或者应该是)很好。唯一的问题是,这将意味着用户思维的转变,因为
plyr
的重命名函数使用
“old”=“new”
,而
dplyr
使用
new=old
,这使得它与dplyr函数的其余部分保持一致。就我个人而言,我不认为这是一个问题——你会很快适应新事物,尤其是当它意味着你的数据处理速度大大加快时。这是预期的功能,因此选择动词
select
。不确定我们是否有这样一句话:选择所有变量,并顺便重命名此列。也许为了避免混淆,您可以编辑您的帖子,以便代码反映
select
的实际行为方式吗?我会投票支持一种简单的
dplyr
方法来保留所有变量,只需重命名一个或两个即可现在我将继续加载
plyr
并使用
rename
@RomainFrancois@aaronwolen您可以使用
mtcars%>%select(matches(“*”),disp2=disp)
实现OP想要的功能。我希望有一个更省钱的解决方案,但它可以工作并保留所有列(尽管不是它们的顺序)
disp
没有重复。您能解释一下语法吗?这比命令更重要。我正在使用
重命名(数据框,OldVarName=NewVarName)
但是我得到了
错误:未知变量:NewVarName.
我不明白为什么。@s\a我已经添加了说明。它应该在查看后显示。如果您有问题,可能明确指定包有助于
dplyr::rename(iris,petal\u length=petal.length)
。两个快速观察:必须将上述命令分配给数据帧才能生效
iris您可以使用
setNames()
如果要批量替换列名:
df%>%mutate(foo=1+2)%%>%setNames(c(“blah”、“blu”、“bar”))
occ_5d <- dplyr::rename(occ_5d, rowname='code_5d')
Error: Unknown column `code_5d` 
Call `rlang::last_error()` to see a backtrace
names(occ_5d)[1] = "code_5d"
iris %>% 
  dplyr::rename_with(.fn = ~ gsub("^S", "s", .), .cols = where(is.numeric))

    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
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
5            5.0         3.6          1.4         0.2     setosa