2015-06-19 27 views
5

Chỉ cần tự hỏi liệu có thể tính phương tiện cho nhiều cột hay không bằng cách chỉ sử dụng hàm trung bìnhtính trung bình cho nhiều cột trong data.frame

ví dụ:

mean(iris[,1]) 

là có thể nhưng không

mean(iris[,1:4]) 

thử:

mean(iris[,c(1:4)]) 

nhận tin nhắn này lỗi:

nhắn Cảnh báo: Trong mean.default (iris [, 1 : 4]): đối số không phải là số hoặc hợp lý: trả về ing NA

Tôi biết tôi chỉ có thể sử dụng lapply (iris [, 1: 4], có nghĩa là) hoặc sapply (iris [, 1: 4], có nghĩa là)

+6

Cách dùng 'colMeans (iris [, 1: 4])'. Lấy giá trị trung bình của data.frame đã không được chấp nhận. Tôi không chắc chắn lý do tại sao bạn mong đợi rằng để làm việc khi bạn đã biết về các giải pháp 'sapply/lapply'. – MrFlick

+0

Sử dụng '? ColMeans' hoặc phương pháp' áp dụng' nhưng có thể cho câu hỏi như vậy, tốt nhất là tìm kiếm stackoverflow. – SabDeM

Trả lời

6

Hãy thử colMeans:

Nhưng cột phải là số. Bạn có thể thêm một thử nghiệm cho nó cho các tập dữ liệu lớn hơn.

colMeans(iris[sapply(iris, is.numeric)]) 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
    5.843333  3.057333  3.758000  1.199333 

Benchmark

vẻ dài cho dplyrdata.table. Có lẽ ai đó có thể tái tạo các kết quả cho tính xác thực.

microbenchmark(
    plafort = colMeans(big.df[sapply(big.df, is.numeric)]), 
    Carlos = colMeans(Filter(is.numeric, big.df)), 
    Cdtable = big.dt[, lapply(.SD, mean)], 
    Cdplyr = big.df %>% summarise_each(funs(mean)) 
) 
#Unit: milliseconds 
# expr  min  lq  mean median  uq  max 
# plafort 9.862934 10.506778 12.07027 10.699616 11.16404 31.23927 
# Carlos 9.215143 9.557987 11.30063 9.843197 10.21821 65.21379 
# Cdtable 57.157250 64.866996 78.72452 67.633433 87.52451 264.60453 
# Cdplyr 62.933293 67.853312 81.77382 71.296555 91.44994 182.36578 

liệu

m <- matrix(1:1e6, 1000) 
m2 <- matrix(rep('a', 1000), ncol=1) 
big.df <- as.data.frame(cbind(m2, m), stringsAsFactors=F) 
big.df[,-1] <- lapply(big.df[,-1], as.numeric) 
big.dt <- as.data.table(big.df) 
+0

Cảm ơn bạn, tôi ở lại với cái lapply quá dài với nó trở về danh sách. –

+0

@ user20650 'colMeans (Bộ lọc (is.numeric, iris))' –

+0

@CarlosCinelli; đẹp .. tôi không bao giờ có vẻ sử dụng này và bỏ phiếu vv vv nhìn vào bộ lọc nó chỉ là không công khai (lapply (..)), nhưng nhiều succunct một lần nữa – user20650

3

Với sapply + Filter:

sapply(Filter(is.numeric, iris), mean) 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
    5.843333  3.057333  3.758000  1.199333 

Với dplyr:

library(dplyr) 
iris %>% summarise_each(funs(mean)) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1:  5.843333 3.057333  3.758 1.199333  NA 

W ith data.table:

library(data.table) 
iris <- data.table(iris) 
iris[,lapply(.SD, mean)] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1:  5.843333 3.057333  3.758 1.199333  NA 
+1

Có lẽ 'iris%>% summaryise_each (funs (mean), -Species)' –

1

Giải pháp trên đây của bạn hoạt động với các cột đúng định dạng .numeric. Xem ví dụ bên dưới:

a <- c(1,2,3) 
mean(a) 

b <- c(2,4,6) 
mean(b) 

d <- c(3,6,9) 

mydata <- cbind(b,a,d) 


mean(mydata[,1:3]) 
+1

Điều này không hoàn toàn đúng. Ví dụ trên là 'data.frame' và không có phương thức sử dụng trung bình trên data.frame. Ví dụ của bạn (loại) hoạt động như bạn có thể lấy giá trị trung bình của một 'ma trận' (' lớp (mydata) '): nhưng nó cho một giá trị trung bình tổng thể chứ không phải theo cột. – user20650

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