/ / dplyr: przekazanie nazwy kolumny w celu podsumowania funkcji wewnętrznej - r, dataframe, dplyr

dplyr: przekazywanie nazwy kolumny w celu podsumowania funkcji wewnętrznej - r, ramka danych, dplyr

Mam następujący przykład, w którym przekazuję prostą ramkę danych do funkcji podsumowującej kolumnę. Nazwa kolumny podsumowującej, sChciałbym mieć jako parametr funkcji:

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")

Jednak niezależnie od ustawionej przeze mnie wartości, kolumna podsumowująca zawsze otrzymuje tę samą nazwę s. Czy jest sposób, aby to zmienić?


EDYCJA: Wyjście, które chciałbym, to:

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

Odpowiedzi:

1 dla odpowiedzi № 1

Jeśli przekazujemy cytowany argument, to jedna opcja jest po summarise, Używamy 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

Lub inną opcją jest skorzystanie z := z !!

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

Lub w ramach summarise

sumf <- function(df, s){

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

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


0 dla odpowiedzi nr 2

Spróbuj tego:

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