2012-03-01 68 views
6

Tôi đang sử dụng by để áp dụng hàm cho một cột phạm vi của khung dữ liệu dựa trên một yếu tố. Mọi thứ hoạt động hoàn hảo tốt nếu tôi sử dụng hàm mean() làm chức năng nhưng nếu tôi sử dụng median() Tôi gặp lỗi loại "Lỗi trong median.default (x): cần dữ liệu số" ngay cả khi tôi không có NA trong dữ liệu khung.Làm thế nào để áp dụng một hàm cho một tập hợp các cột trong r?

Điểm mấu rằng công trình sử dụng mean():

by(iris[,1:3], iris$Species, function(x) mean(x,na.rm=T)) 

> by(iris[,1:3], iris$Species, function(x) mean(x,na.rm=T)) 
iris$Species: setosa 
Sepal.Length Sepal.Width Petal.Length 
     5.006  3.428  1.462 
------------------------------------------------------------ 
iris$Species: versicolor 
Sepal.Length Sepal.Width Petal.Length 
     5.936  2.770  4.260 
------------------------------------------------------------ 
iris$Species: virginica 
Sepal.Length Sepal.Width Petal.Length 
     6.588  2.974  5.552 
Warning messages: 
1: mean(<data.frame>) is deprecated. 
Use colMeans() or sapply(*, mean) instead. 
2: mean(<data.frame>) is deprecated. 
Use colMeans() or sapply(*, mean) instead. 
3: mean(<data.frame>) is deprecated. 
Use colMeans() or sapply(*, mean) instead. 

Nhưng nếu tôi sử dụng median() (chú ý na.rm=T option):

> by(iris[,1:3], iris$Species, function(x) median(x,na.rm=T)) 
Error in median.default(x, na.rm = T) : need numeric data 

Tuy nhiên nếu thay vì chọn phạm vi [,1:3] cột tôi chọn chỉ có một của các cột hoạt động:

> by(iris[,1], iris$Species, function(x) median(x,na.rm=T)) 
iris$Species: setosa 
[1] 5 
------------------------------------------------------------ 
iris$Species: versicolor 
[1] 5.9 
------------------------------------------------------------ 
iris$Species: virginica 
[1] 6.5 

Làm thế nào tôi có thể đạt được hành vi này trong khi chọn một loạt các cột?

+0

Các thông điệp cảnh báo bạn nhận được khi bạn sử dụng 'mean' phải là manh mối mạnh mẽ, trên thực tế, mọi thứ không hoạt động" tốt ". [Answer] http://stackoverflow.com/a/9424510/324364) gần đây của tôi có thể làm sáng tỏ điều này cho bạn. – joran

Trả lời

4

Bạn đang sử dụng chiến lược chia đôi khi bạn sử dụng by. Các đối tượng được truyền cho hàm là các khung dữ liệu và bạn nhận được cảnh báo và lỗi vì không tồn tại của median.data.frame và sự tồn tại không tồn tại của mean.data.frame. Nó có thể làm việc tốt hơn nếu bạn sử dụng aggregate:

> aggregate(iris[,1:3], iris["Species"], function(x) mean(x,na.rm=T)) 
    Species Sepal.Length Sepal.Width Petal.Length 
1  setosa  5.006  3.428  1.462 
2 versicolor  5.936  2.770  4.260 
3 virginica  6.588  2.974  5.552 
> aggregate(iris[,1:3], iris["Species"], function(x) median(x,na.rm=T)) 
    Species Sepal.Length Sepal.Width Petal.Length 
1  setosa   5.0   3.4   1.50 
2 versicolor   5.9   2.8   4.35 
3 virginica   6.5   3.0   5.55 

aggregate công trình trên các vectơ cột riêng và sau đó tổng kết về tỳ kết quả.

+0

Cảm ơn. Nó hoạt dộng bây giờ. Tôi chỉ có nghi ngờ về sự khác nhau giữa: 'aggregate (iris [, 1: 3], iris [" Species "], hàm (x) trung bình (x, na.rm = T))' và ' tổng hợp (iris [, 1: 3], iris $ Loài, hàm (x) trung bình (x, na.rm = T)) '. Thứ hai trả về lỗi này 'Lỗi trong aggregate.data.frame (iris [, 1: 3], iris $ Species, hàm (x) trung bình (x,: 'by' phải là một danh sách' – pedrosaurio

+1

@pedrosaurio Lỗi "iris [" Species "]' là một danh sách (một khung dữ liệu, thực sự), trong khi 'iris $ Species' không phải là. Bạn có thể xác minh điều này bằng cách sử dụng' str() '. – joran

+1

Tôi đã nghĩ đến việc thêm lưu ý rằng bạn đang sử dụng '$ Species' tương đương với' [["Species"]] 'trả về một vector nguyên tử và tôi đang sử dụng' ["Species"] 'để trả về một danh sách. đã làm như vậy. –

1

Câu hỏi ban đầu được trả lời. Tuy nhiên, nếu phạm vi xảy ra là (thay) tất cả các cột, trừ những quy định như các biến độc lập trong công thức, các ký hiệu chấm công thức hoạt động, và đại diện cho một sự thay thế tiện lợi:

> aggregate(. ~ Species, data = iris, mean) 
    Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
1  setosa  5.006  3.428  1.462  0.246 
2 versicolor  5.936  2.770  4.260  1.326 
3 virginica  6.588  2.974  5.552  2.026 

> aggregate(. ~ Species, data = iris, median) 
    Species Sepal.Length Sepal.Width Petal.Length Petal.Width 
1  setosa   5.0   3.4   1.50   0.2 
2 versicolor   5.9   2.8   4.35   1.3 
3 virginica   6.5   3.0   5.55   2.0 
Các vấn đề liên quan