Gunakan fungsi di groupby dengan nama kolom variabel di R menggunakan dplyr [duplikat]

Saya memiliki kerangka data:

df <- data.frame(Category = c(rep("A", 3), rep("B", 3)), Value = rnorm(6))
df
 Category       Value
1        A -0.94968814
2        A  2.56687061
3        A -0.15665153
4        B -0.47647105
5        B  0.83015076
6        B -0.03744522

Sekarang saya ingin menambahkan kolom lain yang merupakan mean per Kategori. Ini dapat dilakukan dengan paket dplyr dengan sangat mudah:

df %>% group_by(Category) %>% 
  summarize(mean = mean(Value))

Sekarang dalam potongan kode, masalah saya adalah: Saya tidak dapat menggunakan mean(Value), tetapi saya memiliki nama variabel yang mengetahui nama kolom: columnName = "Value" Tapi sayangnya ini tidak berhasil:

columnName = "Value"

df %>% group_by(Category) %>% 
  summarize(mean = mean(columnName))

Pesan peringatan: 1: In mean.default("Value") : argumen bukan numerik atau logis: mengembalikan NA 2: In mean.default("Value") :
argumen bukan numerik atau logis: mengembalikan NA

Bagaimana saya bisa meneruskan nama kolom dengan variabel?


person user2874583    schedule 21.12.2016    source sumber
comment
mean(df[,columnName]) kode ini berfungsi untuk saya, ketika menggunakan variabel yang sama seperti Anda.   -  person Benjamin Mohn    schedule 21.12.2016
comment
Tidak, itu tidak berhasil. Itu harus menjadi rata-rata kelompok, bukan rata-rata kolom.   -  person user2874583    schedule 21.12.2016
comment
Itu tidak menggunakan paket dplyr tetapi berfungsi seperti ini: tapply(df[,columnName],df$Category, mean)   -  person Benjamin Mohn    schedule 21.12.2016
comment
harap gunakan set.seed saat menggunakan fungsi seperti rnorm untuk membuat bingkai data sehingga kami dapat memeriksa ulang hasilnya   -  person Sotos    schedule 21.12.2016
comment
Ini disebut evaluasi standar. Ada ratusan penipuan mengenai hal ini di SO. Silakan baca vignette("nse"). Salah satu cara untuk mencapainya adalah library(lazyeval) ; dots <- interp(~ mean(columnName), columnName = as.name("Value")) ; df %>% group_by(Category) %>% summarise_(.dots = dots)   -  person David Arenburg    schedule 21.12.2016
comment
Lihat juga stackoverflow.com/questions/26724124/   -  person David Arenburg    schedule 21.12.2016


Jawaban (1)


Kita dapat menggunakan get dengan aggregate

aggregate(get(columnName)~Category, df, mean)

#    Category get(columnName)
#1        A      -0.5490751
#2        B      -0.2594670
person Ronak Shah    schedule 21.12.2016
comment
Ini berhasil, terima kasih! Tapi saya sedang mencari solusi dalam paket dplyr. Tahukah Anda apakah itu mungkin juga? - person user2874583; 21.12.2016