2014-01-20 19 views
2

我試圖讓一羣投擲警告「的意思是」內功能明智意味着使用按如下:「的」 R中

by(iris[,1:4],iris$Species,mean) 

但我得到警告:

iris$Species: setosa 
[1] NA 
----------------------------------------------------------------------------------------------------------------------------- 
iris$Species: versicolor 
[1] NA 
----------------------------------------------------------------------------------------------------------------------------- 
iris$Species: virginica 
[1] NA 
Warning messages: 
1: In mean.default(data[x, , drop = FALSE], ...) : 
    argument is not numeric or logical: returning NA 
2: In mean.default(data[x, , drop = FALSE], ...) : 
    argument is not numeric or logical: returning NA 
3: In mean.default(data[x, , drop = FALSE], ...) : 
    argument is not numeric or logical: returning NA 

但是,下面的所有命令都能正常工作,我想知道爲什麼意思不能正常工作,如果我提供iris[,1:4]作爲的第一個參數函數ñ。

by(iris[,1:4],iris$Species,summary) 
by(iris[,1],iris$Species,mean) 
aggregate(iris[,1:4],list(iris$Species),mean) 

另外一些谷歌之後,我發現這個link,似乎by(iris[,1:4],iris$Species,mean)命令應該工作。

我無法找到我犯的錯誤。任何人的幫助,非常感謝。

我正在使用內置的虹膜演示數據。

[R版本 - 3.0.2在Windows(32位)

感謝

+0

你怎麼可以添加一個ifelse(is.numeric ,意思是,NA)在那裏? 我無法通過列而不是整個數據。框架 – skan

回答

4

如果你想計算列的平均值,你必須使用colMeans

> by(iris[1:4], iris$Species, colMeans) 

iris$Species: setosa 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
     5.006  3.428  1.462  0.246 
-------------------------------------------------------------------------------- 
iris$Species: versicolor 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
     5.936  2.770  4.260  1.326 
-------------------------------------------------------------------------------- 
iris$Species: virginica 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
     6.588  2.974  5.552  2.026 

更新

順便說一句:你可以使用mean如果使用aggregate代替by

> aggregate(iris[1:4], list(iris$Species), mean) 

    Group.1 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 
+1

+1,非常感謝,但我想知道,如果它是這樣使用colmeans而不是mean,爲什麼鏈接(我發佈)使用mean ,R的早期版本的工作意味着什麼? – PKumar

+1

@PradeepKumar很久以前,函數'mean'應用於數據框時與'colMeans'類似。現在,你必須使用'colMeans'。 –

+1

@PradeepKumar我用'mean'添加了另一個解決方案。 –

2

這是合理的,你想要的東西,如:

> sapply(iris[,1:4],by,iris$Species,mean) 
      Sepal.Length Sepal.Width Petal.Length Petal.Width 
setosa   5.006  3.428  1.462  0.246 
versicolor  5.936  2.770  4.260  1.326 
virginica   6.588  2.974  5.552  2.026 

或者:

> lapply(iris[,1:4],by,iris$Species,mean) 
$Sepal.Length 
iris$Species: setosa 
[1] 5.006 
------------------------------------------------------------ 
iris$Species: versicolor 
[1] 5.936 
------------------------------------------------------------ 
iris$Species: virginica 
[1] 6.588 

$Sepal.Width 
iris$Species: setosa 
[1] 3.428 
------------------------------------------------------------ 
iris$Species: versicolor 
[1] 2.77 
------------------------------------------------------------ 
iris$Species: virginica 
[1] 2.974 

$Petal.Length 
iris$Species: setosa 
[1] 1.462 
------------------------------------------------------------ 
iris$Species: versicolor 
[1] 4.26 
------------------------------------------------------------ 
iris$Species: virginica 
[1] 5.552 

$Petal.Width 
iris$Species: setosa 
[1] 0.246 
------------------------------------------------------------ 
iris$Species: versicolor 
[1] 1.326 
------------------------------------------------------------ 
iris$Species: virginica 
[1] 2.026