替换为;更名为;在dplyr中
我喜欢plyr的重命名功能替换为;更名为;在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
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)以adata.frame
作为第一个参数,b)返回adata.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