我有一個名爲「Something」的數據框。我正在使用匯總在一個數字列上進行彙總,並且我希望該列的名稱包含「Something」 - 列名稱中的數據框標題。使用數據框標題/名稱重命名列名稱
例子:
temp <- Something %>%
group_by(Month) %>%
summarise(avg_score=mean(score))
,但我想的名字總列 「avg_Something_score」。這有道理嗎?
我有一個名爲「Something」的數據框。我正在使用匯總在一個數字列上進行彙總,並且我希望該列的名稱包含「Something」 - 列名稱中的數據框標題。使用數據框標題/名稱重命名列名稱
例子:
temp <- Something %>%
group_by(Month) %>%
summarise(avg_score=mean(score))
,但我想的名字總列 「avg_Something_score」。這有道理嗎?
似乎就像動態生成新列名更有意義,這樣您就不必在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
很棒的回答。我認爲在這種情況下對所有'dplyr'函數使用標準評估是一個好主意。 – www
偉大的答案@ eipi10。 這可能太天真了,但我不確定爲什麼函數以下劃線結尾?要求對summarise_做出解釋並在答案代碼中重命名是否太多了? –
'dplyr'使用[非標準評估](https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html)。 'summarise_'和其他函數''',最後是常規'dplyr'函數的標準評估對象。如果要將「標準」帶引號的變量名稱作爲函數調用的一部分傳遞給dplyr或動態更改名稱,則需要使用這些標準評估版本。我認爲@ akrun的答案使用了相同的想法,但採用了新標準/非標準評估方法,將在dplyr/tidyverse的下一個版本中發佈。 – eipi10
您可以使用rename_
從dplyr
與deparse(substitute(Something))
這樣的:
Something %>%
group_by(Month) %>%
summarise(avg_score=mean(score))%>%
rename_(.dots = setNames("avg_score",
paste0("avg_",deparse(substitute(Something)),"_score")))
你可以使用colnames(東西)< -C( 「分數」, 「something_avg_score」)
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")))
關閉'as.character'的括號在錯誤的地方,但是否則很好+1 – MorganBall
@MorganBall謝謝你指出錯誤。我已經確定了收盤的位置。 – www
我們可以用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
這裏,enquo
從base R
接受輸入的參數,像substitute
並轉換爲quosure
,與quo_name
,我們可以將它轉換爲字符串,通過在group_by/summarise/mutate
等中取消引用(!!
或UQ
)來評估quosure
。賦值lhs(:=
)上的列名也可以通過不加引號來獲得感興趣的列
'dplyr :: rename()'怎麼辦? – Nate