2009-09-29 8 views
7

by()関数の出力をRに丸めようとしています。これは私が持っているものです。Rの関数の丸め出力

> by(glaciers[,1:3],glaciers$activity.level,mean) 

glaciers$activity.level: Active 
     aspect sun.duration  latitude 
-9.444444e+00 1.771778e+03 3.247643e+09 
------------------------------------------- 
glaciers$activity.level: Inactive 
     aspect sun.duration  latitude 
1.041667e+01 2.067583e+03 4.048301e+09 
------------------------------------------- 
glaciers$activity.level: Relict 
     aspect sun.duration  latitude 
1.766667e+01 2.168000e+03 2.759283e+09 

どのように私は私の出力は、小数点以下5桁を言って丸め、まだ要因を手にすることができますか?

私は試しました:round(by(glaciers[,1:3],glaciers$activity.level,mean),5)しかし、エラー:Non-numeric argument to mathematical functionを取得しました。ここで

+2

を:)による()関数の出力は、オブジェクト「によって」であるので、あなたは(ラウンドのようなものを行うことはできませんそれに。 – Shane

答えて

4
by(glaciers[,1:3], glaciers$activity.level, function(x){round(mean(x),5)}) 

UPDATE

は実施例である:

glaciers <- as.data.frame(matrix(rnorm(1000),ncol=4)) 
glaciers[,4] <- sample(0:3,250,replace=TRUE) 
colnames(glaciers) <- c("A","B","C","activity.level") 
by(glaciers[,1:3], glaciers$activity.level, function(x){round(mean(x),5)}) 
+0

Rob、 私もこのメソッドを試しましたが、上記のような指数を持つ丸められていない数値を取得しています。なぜround()関数が通過しているのか不明です。 –

+0

私はこれ以上の周りに遊んだと私は.5で回った場合、それは実際には丸めますが、小数点以下1桁になることがわかりました。私は小数点以下3〜5桁を言うと丸めたいが、整数を使うことはこれをしないように思える。 –

+0

あなたは何をしているのか分かりません。私は実例を含めるために私の答えを更新しました。 –

10

すでに出力を変数に保存されている場合は、X言う:

x <- by(glaciers[,1:3],glaciers$activity.level,mean) 

次に適用されますround()を各要素に渡します(この場合はby()の出力がリストになります)。

x[] <- lapply(x,round,5) 
x 

xではなくx []に再割り当てすると、xはby()からの属性を保持できます。

編集:round()は実際に変数の値を変更しますが、印刷から切り離されています。 formatCにあなたが科学的表記法の出力フォーマットを抑制したい場合は、使用形式は=「F」の引数()

> round(1.2345e10,5) 
[1] 1.2345e+10 
> formatC(1.2345e10,digits=5,format="f") 
[1] "12345000000.00000" 

だから、もともと掲示式と補正が

x[] <- lapply(x,formatC,digits=5,format="f") 
+0

Stephen、 上記のように指数出力を持つ丸数字。何か案は? –

1

だろう、あなたはしたいですかまたは表示された桁数を切り捨てるだけですか?後者の場合は、オプション(数字= 3)などを使用します。

> by(mpg[,8:9], mpg$cyl, mean) 
mpg$cyl: 4 
    cty hwy 
21.012 28.802 
------------------------------------------------------------ 
mpg$cyl: 5 
    cty hwy 
20.50 28.75 
------------------------------------------------------------ 
mpg$cyl: 6 
    cty hwy 
16.215 22.823 
------------------------------------------------------------ 
mpg$cyl: 8 
    cty hwy 
12.571 17.629 
> options(digits=3) 
> by(mpg[,8:9], mpg$cyl, mean) 
mpg$cyl: 4 
cty hwy 
21.0 28.8 
------------------------------------------------------------ 
mpg$cyl: 5 
cty hwy 
20.5 28.8 
------------------------------------------------------------ 
mpg$cyl: 6 
cty hwy 
16.2 22.8 
------------------------------------------------------------ 
mpg$cyl: 8 
cty hwy 
12.6 17.6 
1

はわずか数分のカップルを持っていますが、format()formatC()、およびprettyNum()機能を見てみてください。彼らのヘルプファイルは、今私にはばかげているように見えますが、私はあまり寝ていません。しかし、私は非常に具体的にフォーマットされた数字が必要になった数ヶ月前にSweaveレポートのためにこれらの機能のうちの1つ、最も可能性が高いのはformatC()を使用しました。

+0

明確にするには、RobとStephenがround()で行ったようにby()関数に入れる必要があります。 –

6

round()非常に大きな数値で作業しているので、この例では意味がありません。 format()コマンドを使い、表示する桁数を選択します。例えば、3桁表示するには:

by(glaciers[,1:3], glaciers$activity.level, function(x) { 
     as.numeric(format(mean(x), digits=3)) 
}) 
2

をあなたは「どのように私は私の出力は、小数点以下5桁を言うために丸めるために得ることができますか?」尋ねましたしかし、私はあなたが意味していたと思った "私は6つの重要な数字を表示するために私の出力を得ることができますか?次のコードは、res []への再割り当てのアイデアと丸めではなくsignifの使用の2つを組み合わせています。

glaciers <- data.frame(aspect=runif(20)*100, 
         sun.duration=runif(20)*10000, 
         latitude=runif(20)*10^9, 
         activity.level=sample(c('Active','Inactive','Relict'),20,replace=TRUE)) 
res <- by(glaciers[,1:3],glaciers$activity.level,mean) 
res[] <- lapply(res,signif,3) 
res 

このコードは次のような出力生成:ちょうど追加する

glaciers$activity.level: Active 
     aspect sun.duration  latitude 
    3.66e+01  4.72e+03  4.56e+08 
------------------------------------------------- 
glaciers$activity.level: Inactive 
     aspect sun.duration  latitude 
    5.81e+01  5.28e+03  4.83e+08 
------------------------------------------------- 
glaciers$activity.level: Relict 
     aspect sun.duration  latitude 
    6.08e+01  4.75e+03  3.98e+08