如何在R中创建一个函数,将输出作为名称的一部分,对数据框列进行子集和重命名?

问题描述 投票:0回答:1

我正试图从许多数据框架中选择和重命名列,并希望制作一个函数。我最终将合并子集数据,所以我想先用一个前缀重命名列,以区分从每个数据框中导出的数据。我如何将其制作成一个函数?

下面是一个例子,其中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))
}
r dataframe subset rename
1个回答
0
投票

如果我们使用的是管道,那么就不要用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_allrename_withdplyr 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
© www.soinside.com 2019 - 2024. All rights reserved.