2017-04-21 126 views
4

我有一個名爲「Something」的數據框。我正在使用匯總在一個數字列上進行彙總,並且我希望該列的名稱包含「Something」 - 列名稱中的數據框標題。使用數據框標題/名稱重命名列名稱

例子:

temp <- Something %>% 
    group_by(Month) %>% 
    summarise(avg_score=mean(score)) 

,但我想的名字總列 「avg_Something_score」。這有道理嗎?

+0

'dplyr :: rename()'怎麼辦? – Nate

回答

2

似乎就像動態生成新列名更有意義,這樣您就不必在setNames內硬編碼數據幀的名稱。也許類似下面的函數,它接受一個數據幀,分組變量,和數值變量:

library(dplyr) 
library(lazyeval) 

my_fnc = function(data, group, value) { 

    df.name = deparse(substitute(data)) 

    data %>% 
    group_by_(group) %>% 
    summarise_(avg = interp(~mean(v), v=as.name(value))) %>% 
    rename_(.dots = setNames("avg", paste0("avg_", df.name, "_", value))) 
} 

現在,讓我們在兩個不同的數據幀運行功能:

my_fnc(mtcars, "cyl", "mpg") 
cyl avg_mtcars_mpg 
    <dbl>   <dbl> 
1  4  26.66364 
2  6  19.74286 
3  8  15.10000 
my_fnc(iris, "Species", "Petal.Width") 
 Species avg_iris_Petal.Width 
1  setosa    0.246 
2 versicolor    1.326 
3 virginica    2.026 
+0

很棒的回答。我認爲在這種情況下對所有'dplyr'函數使用標準評估是一個好主意。 – www

+0

偉大的答案@ eipi10。 這可能太天真了,但我不確定爲什麼函數以下劃線結尾?要求對summarise_做出解釋並在答案代碼中重命名是否太多了? –

+0

'dplyr'使用[非標準評估](https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html)。 'summarise_'和其他函數''',最後是常規'dplyr'函數的標準評估對象。如果要將「標準」帶引號的變量名稱作爲函數調用的一部分傳遞給dplyr或動態更改名稱,則需要使用這些標準評估版本。我認爲@ akrun的答案使用了相同的想法,但採用了新標準/非標準評估方法,將在dplyr/tidyverse的下一個版本中發佈。 – eipi10

3

您可以使用rename_dplyrdeparse(substitute(Something))這樣的:

Something %>% 
group_by(Month) %>% 
summarise(avg_score=mean(score))%>% 
rename_(.dots = setNames("avg_score", 
paste0("avg_",deparse(substitute(Something)),"_score"))) 
0

你可以使用colnames(東西)< -C( 「分數」, 「something_avg_score」)

2
library(dplyr) 

# Take mtcars as an example 
# Calculate the mean of mpg using cyl as group 
data(mtcars) 
Something <- mtcars 

# Create a list of expression 
dots <- list(~mean(mpg)) 

# Apply the function, Use setNames to name the column 
temp <- Something %>% 
    group_by(cyl) %>% 
    summarise_(.dots = setNames(dots, 
           paste0("avg_", as.character(quote(Something)), "_score"))) 
+0

關閉'as.character'的括號在錯誤的地方,但是否則很好+1 – MorganBall

+0

@MorganBall謝謝你指出錯誤。我已經確定了收盤的位置。 – www

3

我們可以用dplyr的開發人員版本(即將發佈0.6.0),這是否與quosure小號

library(dplyr) 
myFun <- function(data, group, value){ 
     dataN <- quo_name(enquo(data)) 
     group <- enquo(group) 
     value <- enquo(value) 

     newName <- paste0("avg_", dataN, "_", quo_name(value)) 
    data %>% 
     group_by(!!group) %>% 
     summarise(!!newName := mean(!!value)) 
} 

myFun(mtcars, cyl, mpg) 
# A tibble: 3 × 2 
# cyl avg_mtcars_mpg 
# <dbl>   <dbl> 
#1  4  26.66364 
#2  6  19.74286 
#3  8  15.10000 

myFun(iris, Species, Petal.Width) 
# A tibble: 3 × 2 
#  Species avg_iris_Petal.Width 
#  <fctr>    <dbl> 
#1  setosa    0.246 
#2 versicolor    1.326 
#3 virginica    2.026 

這裏,enquobase R接受輸入的參數,像substitute並轉換爲quosure,與quo_name,我們可以將它轉換爲字符串,通過在group_by/summarise/mutate等中取消引用(!!UQ)來評估quosure。賦值lhs(:=)上的列名也可以通過不加引號來獲得感興趣的列