ฉันมีกรอบข้อมูลต่อไปนี้
x <- read.table(text = " id1 id2 val1 val2
1 a x 1 9
2 a x 2 4
3 a y 3 5
4 a y 4 9
5 b x 1 7
6 b y 4 4
7 b x 3 9
8 b y 2 8", header = TRUE)
ฉันต้องการคำนวณค่าเฉลี่ยของ val1 และ val2 ที่จัดกลุ่มตาม id1 และ id2 และนับจำนวนแถวสำหรับชุดค่าผสม id1-id2 แต่ละชุดพร้อมกัน ฉันสามารถทำการคำนวณแต่ละรายการแยกกัน:
# calculate mean
aggregate(. ~ id1 + id2, data = x, FUN = mean)
# count rows
aggregate(. ~ id1 + id2, data = x, FUN = length)
เพื่อที่จะทำการคำนวณทั้งสองในการโทรครั้งเดียวฉันพยายาม
do.call("rbind", aggregate(. ~ id1 + id2, data = x, FUN = function(x) data.frame(m = mean(x), n = length(x))))
อย่างไรก็ตามฉันได้รับผลลัพธ์ที่อ่านไม่ออกพร้อมกับคำเตือน:
# m n
# id1 1 2
# id2 1 1
# 1.5 2
# 2 2
# 3.5 2
# 3 2
# 6.5 2
# 8 2
# 7 2
# 6 2
# Warning message:
# In rbind(id1 = c(1L, 2L, 1L, 2L), id2 = c(1L, 1L, 2L, 2L), val1 = list( :
# number of columns of result is not a multiple of vector length (arg 1)
ฉันสามารถใช้แพ็คเกจ plyr ได้ แต่ชุดข้อมูลของฉันค่อนข้างใหญ่และ plyr ช้ามาก (แทบจะใช้ไม่ได้) เมื่อขนาดของชุดข้อมูลโตขึ้น
ฉันจะใช้aggregate
หรือฟังก์ชันอื่น ๆ เพื่อทำการคำนวณหลายอย่างในการโทรครั้งเดียวได้อย่างไร
aggregate
ที่กล่าวถึงในคำตอบก็ยังมีและby
tapply