3

Sweave/knitr で使用する mean 関数と sem 関数を作成するためのブレインストーミングを行っています。そして、私の限られた知識では、このように見えます

m.se <- function (x, na.rm = TRUE) {
    if (na.rm) 
        x <- x[!is.na(x)]
    n <- length(x)
    if (n == 0) 
        return(c(mean = NA, sem = NA))
     xbar <- sum(x)/n
     se <- sqrt(sum((x - xbar)^2)/(n - 1))/sqrt(n)
     c(mean = xbar, sem = se)
     return(paste(xbar,"\\pm",se))
}

それは実際にいくつかの仕事をし、次のような出力を与えます:

43.9303846153846 \pm 3.34823050767781

option()問題は、メイン環境 (knitr のセットアップ チャンク) で定義することを尊重しないことです。どうすればこの問題を解決できますか。

4

3 に答える 3

2

平均と標準偏差のコードは最適ではありません。mean()ディーター・メンネが述べたように、組み込みを使用するだけでよくsd()、運動目的でこれを行っていない場合.

このknitrパッケージは、数値をより適切に表示するために多大な努力を払ってきました。独自のフォーマット規則を発明する代わりに、これらの機能を使用することをお勧めします。私の解決策については以下を参照してください(\Sexpr{}尊重しoptions('digits')ます):

\documentclass{article}
\begin{document}

<<mean-sem>>=
options(digits = 3)
m.se <- function (x, ...) {
  n <- length(x)
  if (n == 0) return(c(mean = NA, sem = NA))
  se <- sd(x, ...)/sqrt(n)
  c(mean = mean(x, ...), sem = se)
}
res <- m.se(rnorm(100))
@

What you want is $\Sexpr{res['mean']} \pm \Sexpr{res['sem']}$.

\end{document}

さらに重要なことに、これは移植可能なソリューションです。HTML バージョンが必要な場合は、単に を記述<!--rinline res['mean']--> ± <!--rinline res['sem']-->し、R 関数を再定義する必要はありません。

于 2013-01-04T19:21:03.583 に答える
1

format関数がうまくいくと思います:

R> 1.1111111
[1] 1.111
R> paste(1.1111111)
[1] "1.1111111"
R> paste(format(1.1111111))
[1] "1.111"

だからあなたの場合、

paste(format(xbar), "\\pm", format(se))
于 2013-01-03T19:51:11.270 に答える
1

@csgilliespie が指摘したように、format ステートメントはその仕事をしますが、これはおそらくフォーマットを提供したいという問題をまだ解決していませんoption(digit=3)。ビューから数値を分離することにより、2 段階のアプローチでこれを行うのが最善です。例を参照してくださいprint.lm(() なし)。

m.se <- function (x, na.rm = TRUE) {
  if (na.rm) 
    x <- x[!is.na(x)]
  n <- length(x)
  if (n == 0) 
    return(c(mean = NA, sem = NA))
  xbar <- sum(x)/n
  se <- sqrt(sum((x - xbar)^2)/(n - 1))/sqrt(n)
  ret = c(mean = xbar, sem = se)
  class(ret) ="m.se"
  ret
}

print.m.se = function(x, digits = max(3, getOption("digits") - 3),...){
  print(paste(format(x["mean"],digits=digits), "//pm",format(x["sem"],digits=digits)))
  invisible(x)
}

m.se(rnorm(10))
于 2013-01-03T20:21:47.450 に答える