我有以下几点:
library(tidyverse)
df <- structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5), Sepal.Width = c(3.5,
3, 3.2, 3.1, 3.6), Petal.Length = c(1.4, 1.4, 1.3, 1.5, 1.4)), .Names = c("Sepal.Length",
"Sepal.Width", "Petal.Length"), row.names = c(NA, 5L), class = c("tbl_df",
"tbl", "data.frame"))
看起来这就是这个:
> df
# A tibble: 5 × 3
Sepal.Length Sepal.Width Petal.Length
* <dbl> <dbl> <dbl>
1 5.1 3.5 1.4
2 4.9 3.0 1.4
3 4.7 3.2 1.3
4 4.6 3.1 1.5
5 5.0 3.6 1.4
我想要做的是用附加的字符串Sepal.Length
替换Petal.Length
和to_app <- ".xxx"
,结果是:
Sepal.Length.xxx Sepal.Width Petal.Length.xxx
5.1 3.5 1.4
4.9 3.0 1.4
4.7 3.2 1.3
4.6 3.1 1.5
5.0 3.6 1.4
我尝试了这个错误:
>df %>% rename(paste(Sepal.Length,to_app,sep="") = Petal.Length,paste(Sepal.Width,to_app,sep="") = Petal.Length)
Error: unexpected '=' in "df %>% rename(paste(Sepal.Length,to_app,sep="") ="
答案 0 :(得分:10)
您可以使用rename_at
函数(从 dplyr_0.7.0 开始)。
例如,您可以将要重命名的变量作为字符串传递。在您的示例中,paste0
函数可用于在每个列的相应后缀上附加。
cols = c("Sepal.Length", "Petal.Length")
to_app = ".xxx"
rename_at(df, cols, funs( paste0(., to_app) ) )
# A tibble: 5 x 3
Sepal.Length.xxx Sepal.Width Petal.Length.xxx
* <dbl> <dbl> <dbl>
1 5.1 3.5 1.4
2 4.9 3.0 1.4
3 4.7 3.2 1.3
4 4.6 3.1 1.5
5 5.0 3.6 1.4
您还可以使用选择辅助函数来选择重命名变量,例如contains
。
rename_at(df, vars( contains("Length") ), funs( paste0(., ".xxx") ) )
# A tibble: 5 x 3
Sepal.Length.xxx Sepal.Width Petal.Length.xxx
* <dbl> <dbl> <dbl>
1 5.1 3.5 1.4
2 4.9 3.0 1.4
3 4.7 3.2 1.3
4 4.6 3.1 1.5
5 5.0 3.6 1.4
答案 1 :(得分:9)
如果你想使用dplyr的rename
函数,最好创建一个命名向量/列表,并使用标准评估版中的.dots
参数调用它:
cols <- c("Sepal.Length", "Petal.Length")
to_app <- ".xxx"
cols <- setNames(cols, paste0(cols, to_app))
df %>% rename_(.dots = cols)
## A tibble: 5 × 3
# Sepal.Length.xxx Sepal.Width Petal.Length.xxx
#* <dbl> <dbl> <dbl>
#1 5.1 3.5 1.4
#2 4.9 3.0 1.4
#3 4.7 3.2 1.3
#4 4.6 3.1 1.5
#5 5.0 3.6 1.4
但请注意,此方法可能会随着dplyr的下一个版本0.6.0而发生变化(请参阅例如http://blog.rstudio.org/2017/04/13/dplyr-0-6-0-coming-soon/和http://dplyr.tidyverse.org/articles/programming.html)。
答案 2 :(得分:8)
我在这方面迟到了一点,但是在长时间盯着programming vignette之后,我在Different input and output variable 找到了相关的例子。
在我更简单的用例中,我只需要将列重命名为字符串的值:
> df1 = data_frame(index = 1:5, value = c(10, 20, 30, 40, 50))
> df1
# A tibble: 5 x 2
index value
<int> <dbl>
1 1 10
2 2 20
3 3 30
4 4 40
5 5 50
> newname = 'blau'
> newname2 = 'wheee'
> df1 %>% rename(!!newname := value, !!newname2 := index)
# A tibble: 5 x 2
wheee blau
<int> <dbl>
1 1 10
2 2 20
3 3 30
4 4 40
5 5 50
因此,如果您乐意手动执行此操作,则可以:
df %>%
rename(!!paste("Sepal.Length", "xxx", sep = ".") := Sepal.Length)
但是,如果您需要自动将".xxx"
附加到的任何列名称,我建议您仔细查看该部分。不幸的是,它仍然有点过头,但我可以看到它的可行性&gt; _&gt;
答案 3 :(得分:3)
df %>% setNames(paste0(names(.), to.app))
# A tibble: 5 × 3
Sepal.Length.xxx Sepal.Width.xxx Petal.Length.xxx
* <dbl> <dbl> <dbl>
1 5.1 3.5 1.4
2 4.9 3.0 1.4
3 4.7 3.2 1.3
4 4.6 3.1 1.5
5 5.0 3.6 1.4
编辑:
抱歉没有正确阅读。这是data.table包的解决方案。
var <- names(df)[c(1,3)]
df %>% setnames(., var, paste0(var, to.app))
df
# A tibble: 5 × 3
Sepal.Length.xxx Sepal.Width Petal.Length.xxx
* <dbl> <dbl> <dbl>
1 5.1 3.5 1.4
2 4.9 3.0 1.4
3 4.7 3.2 1.3
4 4.6 3.1 1.5
5 5.0 3.6 1.4
答案 4 :(得分:2)
假设目标是重命名包含“Length”的所有列:
colnames(df) <- ifelse(grepl("Length", colnames(df)),
paste0(colnames(df), to_app),
colnames(df))
答案 5 :(得分:1)
我可以在dplyr
的开发版中做到最好(将于5月11日发布):
cols <- c("Sepal.Length", "Petal.Length")
to_app <- ".xxx"
ns <- paste0(cols, to_app)
rename(df,
!!ns[1] := !!as.name(cols[1]),
!!ns[2] := !!as.name(cols[2]))
要以编程方式完成此操作,需要使用quos
代替:
xx <- do.call(quos, setNames(map(cols, as.name), ns))
rename(df, !!!xx)
两者都给:
# A tibble: 5 × 3 Sepal.Length.xxx Sepal.Width Petal.Length.xxx * <dbl> <dbl> <dbl> 1 5.1 3.5 1.4 2 4.9 3.0 1.4 3 4.7 3.2 1.3 4 4.6 3.1 1.5 5 5.0 3.6 1.4
一个班轮:
rename(df, !!!do.call(quos, setNames(map(cols, as.name), paste0(cols, to_app))))