ใช้ฟังก์ชันใน groupby พร้อมชื่อคอลัมน์ตัวแปรใน R โดยใช้ dplyr [ซ้ำกัน]

ฉันมีดาต้าเฟรม:

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

ตอนนี้ฉันต้องการเพิ่มอีกคอลัมน์ซึ่งเป็นค่าเฉลี่ยต่อหมวดหมู่ สามารถทำได้ด้วยแพ็คเกจ dplyr ง่ายมาก:

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

ตอนนี้ในส่วนของโค้ดปัญหาของฉันคือ: ฉันไม่สามารถใช้ mean(Value) ได้ แต่ฉันมีชื่อตัวแปรที่รู้ชื่อคอลัมน์: columnName = "Value" แต่น่าเสียดายที่สิ่งนี้ใช้ไม่ได้:

columnName = "Value"

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

ข้อความเตือน: 1: ใน mean.default("Value") : อาร์กิวเมนต์ไม่ใช่ตัวเลขหรือตรรกะ: ส่งคืน NA 2: ใน mean.default("Value") :
อาร์กิวเมนต์ไม่ใช่ตัวเลขหรือตรรกะ: ส่งกลับ NA

ฉันจะส่งชื่อคอลัมน์ด้วยตัวแปรได้อย่างไร


person user2874583    schedule 21.12.2016    source แหล่งที่มา
comment
mean(df[,columnName]) รหัสนี้ใช้งานได้สำหรับฉัน เมื่อใช้ตัวแปรเดียวกันกับที่คุณทำ   -  person Benjamin Mohn    schedule 21.12.2016
comment
ไม่ นั่นไม่ได้ผล ต้องเป็นค่าเฉลี่ยของกลุ่ม ไม่ใช่ค่าเฉลี่ยของคอลัมน์   -  person user2874583    schedule 21.12.2016
comment
ไม่ได้ใช้แพ็คเกจ dplyr แต่ใช้งานได้ดังนี้: tapply(df[,columnName],df$Category, mean)   -  person Benjamin Mohn    schedule 21.12.2016
comment
โปรดใช้ set.seed เมื่อใช้ฟังก์ชันเช่น rnorm เพื่อสร้างกรอบข้อมูลเพื่อให้เราตรวจสอบผลลัพธ์ได้อีกครั้ง   -  person Sotos    schedule 21.12.2016
comment
สิ่งนี้เรียกว่า การประเมินมาตรฐาน มีผู้หลอกลวงหลายร้อยคนเกี่ยวกับเรื่องนี้ใน SO โปรดอ่านvignette("nse") วิธีหนึ่งในการบรรลุเป้าหมายนี้คือ 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
ดูเพิ่มเติมที่ stackoverflow.com/questions/26724124/   -  person David Arenburg    schedule 21.12.2016


คำตอบ (1)


เราสามารถใช้ get กับ 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
มันใช้งานได้ ขอบคุณ! แต่ฉันกำลังมองหาวิธีแก้ปัญหาภายในแพ็คเกจ dplyr คุณรู้ไหมว่ามันเป็นไปได้เช่นกัน? - person user2874583; 21.12.2016