我正试图从许多数据框架中选择和重命名列,并希望制作一个函数。我最终将合并子集数据,所以我想先用一个前缀重命名列,以区分从每个数据框中导出的数据。我如何将其制作成一个函数?
下面是一个例子,其中x是一个数据框。
title <- (deparse(substitute(x))) #get the name of the dataframe
myname <- (paste(title, "avg_logFC", sep = "_")) #make a new variable that pastes the name of the
dataframe onto the name of the column
test <- x %>% select(avg_logFC) #How can I rename the new column using the "myname" variable?
names(test) <- print(myname) #this works, but not within a function.
我尝试了下面的函数,但没有成功。
myfunction <- function(x) {
x <- as.data.frame(x %>% select(avg_logFC))
title <- (deparse(substitute(x)))
myname <- (paste(title, "avglogFC", sep = "_"))
x <- as.data.frame(x %>% names(x) <- print(myname))
}
如果我们使用的是管道,那么就不要用assingment(<-
)使用 setNames
(自 base R
)或 set_names
(自 dplyr
)或与 rename
library(dplyr)
myfunction <- function(dat){
myname <- paste(deparse(substitute(dat)), "avglogFC", sep="_")
dat %>%
select(avglogFC) %>%
rename(!! myname := avglogFC)
}
-用一个可重复的例子进行测试
data(mtcars)
dat1 <- head(mtcars) %>%
mutate(avglogFC = mean(log(mpg)))
myfunction(dat1)
# dat1_avglogFC
#1 3.017272
#2 3.017272
#3 3.017272
#4 3.017272
#5 3.017272
#6 3.017272
或者另一种选择是 rename_at/rename_all
或 rename_with
从 dplyr 1.0.0
myfunction <- function(dat){
myname <- paste(deparse(substitute(dat)), "avglogFC", sep="_")
dat %>%
select(avglogFC) %>%
rename_with(~ myname, everything())
}
myfunction(dat1)
# dat1_avglogFC
#1 3.017272
#2 3.017272
#3 3.017272
#4 3.017272
#5 3.017272
#6 3.017272