2013-07-15 43 views
5

Tôi có thể sử dụng aggregate() với nhiều chức năng hơn theo cách sao cho tổng hợp được lưu trữ dưới dạng các cột riêng biệt và không phải là một phần của ma trận không? Tôi muốn có khung dữ liệu với các cột Group.1, cyl.1, cyl.2, không phải Group.1, cyl.Tổng hợp() với nhiều chức năng hơn -

# Only one function 
> aggdata <-aggregate(mtcars["cyl"], by=list(vs), FUN=mean, na.rm=TRUE) 
> aggdata 
    Group.1  cyl 
1  0 7.444444 
2  1 4.571429 
> str(aggdata) 
'data.frame': 2 obs. of 2 variables: 
$ Group.1: num 0 1 
$ cyl : num 7.44 4.57 
> 
# Two functions 
> aggdata <-aggregate(mtcars["cyl"], by=list(cyl), FUN=function(x) c(length(x),mean(x))) 
> aggdata 
    Group.1 cyl.1 cyl.2 
1  4 11  4 
2  6  7  6 
3  8 14  8 
> str(aggdata) 
'data.frame': 3 obs. of 2 variables: 
$ Group.1: num 4 6 8 
$ cyl : num [1:3, 1:2] 11 7 14 4 6 8 
> aggdata$cyl 
    [,1] [,2] 
[1,] 11 4 
[2,] 7 6 
[3,] 14 8 

Trả lời

8

Wrap nó trong do.call(data.frame, ...):

aggdata <-aggregate(mtcars["cyl"], by=list(mtcars$cyl), 
        FUN=function(x) c(length(x),mean(x))) 
do.call(data.frame, aggdata) 
# Group.1 cyl.1 cyl.2 
# 1  4 11  4 
# 2  6  7  6 
# 3  8 14  8 
str(do.call(data.frame, aggdata)) 
# 'data.frame': 3 obs. of 3 variables: 
# $ Group.1: num 4 6 8 
# $ cyl.1 : num 11 7 14 
# $ cyl.2 : num 4 6 8 

Sau khi tìm kiếm một chút, tôi chỉ tìm thấy the source of my answer. Có một vài câu hỏi khác tương tự như vậy, nhưng đây là nơi tôi đã học cách tiếp cận do.call(data.frame, ...).

(Came để ghi nhớ những gì để tìm kiếm sau @ James nói thêm câu trả lời giống như tôi đã làm và xóa mình ....)

6

Dưới đây là một ý tưởng khác nhau - chuyển sang data.table thay vì:

library(data.table) 
dt = data.table(mtcars) 

dt[, list(.N, mean(cyl)), by = cyl] 
# cyl N V2 
#1: 6 7 6 
#2: 4 11 4 
#3: 8 14 8 
# note, data.table is smart enough not to copy cyl needlessly 
# when you're grouping by it, so if you attempt to get length(cyl), you'll get 1 
# since cyl is just a number in each 'by' group 

str(dt[, list(.N, mean(cyl)), by = cyl]) 
#Classes ‘data.table’ and 'data.frame': 3 obs. of 3 variables: 
# $ cyl: num 6 4 8 
# $ N : int 7 11 14 
# $ V2 : num 6 4 8 
# - attr(*, ".internal.selfref")=<externalptr> 
+0

+1. Tôi nghĩ về việc chia sẻ tùy chọn này, bởi vì tôi thích cú pháp của nó tốt hơn nhiều, nhưng nó không giải quyết câu hỏi thực sự về việc phải làm gì với kết quả của 'aggregate', mà tôi đã gặp trước đó và thấy hơi khó xử lý . – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Tôi đồng ý rằng nó không trả lời câu hỏi (và theo như câu hỏi của bạn là câu trả lời cho nó), nhưng về cơ bản tôi nghĩ rằng OP đã đặt câu hỏi sai :) – eddi

+1

Tôi chỉ tìm thấy [nguồn gốc của tôi answer] (http://stackoverflow.com/a/14759569/1270695). Có một số câu hỏi khác tương tự như vậy, nhưng đây là nơi tôi đã học cách tiếp cận 'do.call (data.frame, ...)'. – A5C1D2H2I1M1N2O1R2T1

Các vấn đề liên quan