Tôi có khung dữ liệu sau
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)
Tôi muốn tính giá trị trung bình của val1 và val2 được nhóm theo id1 và id2, đồng thời đếm số hàng cho mỗi kết hợp id1-id2. Tôi có thể thực hiện từng phép tính riêng biệt:
# calculate mean
aggregate(. ~ id1 + id2, data = x, FUN = mean)
# count rows
aggregate(. ~ id1 + id2, data = x, FUN = length)
Để thực hiện cả hai phép tính trong một lần gọi, tôi đã thử
do.call("rbind", aggregate(. ~ id1 + id2, data = x, FUN = function(x) data.frame(m = mean(x), n = length(x))))
Tuy nhiên, tôi nhận được một đầu ra bị cắt xén cùng với một cảnh báo:
# 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)
Tôi có thể sử dụng gói plyr, nhưng tập dữ liệu của tôi khá lớn và plyr rất chậm (gần như không sử dụng được) khi kích thước của tập dữ liệu lớn lên.
Làm cách nào để sử dụng aggregate
hoặc các hàm khác để thực hiện một số phép tính trong một cuộc gọi?
aggregate
được đề cập trong các câu trả lời còn cóby
vàtapply
.