/ / dplyr: passaggio del nome della colonna per riepilogare la funzione interna - r, dataframe, dplyr

dplyr: nome della colonna che passa per riassumere la funzione interna - r, dataframe, dplyr

Ho l'esempio seguente, in cui passo un semplice frame di dati a una funzione che riepiloga una colonna. Il nome della colonna di riepilogo, s, Vorrei avere come parametro la funzione:

df <- data.frame(id = c(1,1,1,1,1,2,2,2,2,2),
a=c(1:10),
b=c(10:19))

sum <- function(df, s){
df <- df %>%
group_by(id) %>%
summarize(s = sum(a))
return(df)
}

sum(df = df, s = "summarizing.column.label")

Tuttavia, indipendentemente dal valore impostato, la colonna di riepilogo ottiene sempre lo stesso nome s. C'è un modo per alterarlo?


EDIT: L'output che vorrei è:

sum(df = df, s = "summarizing.column.label")

id     summarizing.column.label
<dbl> <int>
1  1.00    15
2  2.00    40

sum(df = df, s = "a")

id     a
<dbl> <int>
1  1.00    15
2  2.00    40

risposte:

1 per risposta № 1

Se stiamo passando un argomento tra virgolette, un'opzione è dopo il summarise, noi usiamo rename_at

sumf <- function(df, s){

df %>%
group_by(id) %>%
summarize(a = sum(a))%>%
rename_at("a", ~ s)


}

sumf(df, s  ="summarizing.column.label" )
# A tibble: 2 x 2
#     id summarizing.column.label
#  <dbl>                    <int>
#1  1.00                       15
#2  2.00                       40

sumf(df, s  ="a" )
# A tibble: 2 x 2
#     id     a
#   <dbl> <int>
#1  1.00    15
#2  2.00    40

Oppure un'altra opzione è quella di utilizzare := con !!

sumf <- function(df, s){

df %>%
group_by(id) %>%
summarize(a = sum(a))%>%
rename(!! (s) := a)
}

sumf(df, s  ="summarizing.column.label" )
# A tibble: 2 x 2
#     id summarizing.column.label
#  <dbl>                    <int>
#1  1.00                       15
#2  2.00                       40

O dentro summarise

sumf <- function(df, s){

df %>%
group_by(id) %>%
summarise(!!(s) :=  sum(a))
}

sumf (df, s = "summarizing.column.label")


0 per risposta № 2

Prova questo:

sum <- function(df, s){
df <- df %>%
group_by(id) %>%
summarize(!!s := sum(a))
return(df)
}