3

summaryデフォルトでは希望どおりの結果が得られないため、独自の記述統計テーブルを作成するコードをいくつか書きました。

今私が望むのは、さまざまな数の変数でこれを行う柔軟で動的な関数を作成することです。

私のコードは次のようになります。

N <- c( length(data1), length(data2), length(data3) ) 
mean<- c( mean(data1), mean(data2), mean(data3) )
sd <- c( sd(data1), sd(data2), sd(data3) )
min <- c( min(data1), min(data2), min(data3) )
max <- c( max(data1), max(data2), max(data3) )
print(q) <- data.frame(N, mean, sd, min, max)

したがって、3 つの変数以外の説明が必要な場合は、これを編集する代わりに、このようなことを行う関数が必要です。

descriptive <- function(data1, ...) {
  N <- c( length(data1), length(...) ) 
  mean<- c( mean(data1), mean(...) )
  sd <- c( sd(data1), sd(...) )
  min <- c( min(data1), min(...) )
  max <- c( max(data1), max(...) )
  q <- data.frame(N, mean, sd, min, max)
  print(q)
}

上記を試してうまくいくことを望んでいましたが、2つの変数でしか機能しません。ご覧のとおり、私は R を初めて使用します。解決策を探してみましたが、見つかりませんでした。しかし、もしRが「彼ら」が言うほど優れているなら、私はこのようなことが可能であるべきだと思います.

おそらくすでにこれを行う機能がありますが、自分でできるようにしたいと思います。(: 誰かが私を助けてくれることを願っています!

編集!!

ご回答いただきありがとうございます。すべてうまくいくようです。これは、R で同じ質問に対して複数の回答があることを示しています。受け入れられた回答に対してポイントが得られるかどうか、これが重要かどうかはわかりませんが、説明的な表を作成するという私の目的に近いため、Arun の回答を選択します。 「見栄えがよく」柔軟です。

将来誰かが興味を持っている場合は、これをArunの回答に追加して、私の目的に完全に適合させます。

data <- list(var1, var2 ...)
names <- c"name1", "name2", "...")
descriptive(data)

このソリューションには、データフレームとは異なる長さの変数の利点もあるようです。

4

3 に答える 3

4

これは、関数のファミリを学習する良い機会になるため、apply目的の出力を関数として指定し、それapplyをデータフレームに指定できます。

mydf <- data.frame(x=rnorm(100), y=rnorm(100)) # example data

descriptive <- function(x)
   c(length=length(x), mean=mean(x), sd=sd(x), min=min(x), max=max(x))

sapply(mydf, descriptive) # apply `descriptive` to the df

出力:

                   x             y             z
length  1.000000e+03 1000.00000000 1000.00000000
mean    3.846765e-03   -0.02009427    0.02001385
sd      9.818488e-01    0.97662850    1.01543571
min    -2.905149e+00   -3.25904432   -3.33017918
max     3.235993e+00    2.86892044    3.13183601

これに関する 1 つの注意点は、より洗練されたdescriptive関数を開発しない限り、データ内の値を処理できずNA、データフレーム内の異なるクラスの変数で問題が発生することです (たとえば、文字ベクトルの平均は ですNA) 。 .

これは、ベクトルのリスト (Arun が示唆するように) とplyr (Baptiste: から) に内部的に適用される関数を作成するよりも効率的ですldply(mydf, each(length, mean, sd, min, max))

mydf <- data.frame(x=rnorm(1e5),y=rnorm(1e5),z=rnorm(1e5))
microbenchmark(sapply(mydf,thomas), arun(mydf), baptiste(mydf))

Unit: milliseconds
                 expr       min        lq    median        uq      max neval
 sapply(mydf, thomas)  5.693252  6.039458  7.139658  7.953309 43.32675   100
           arun(mydf) 15.805778 18.522889 19.417559 22.016125 57.93630   100
       baptiste(mydf) 10.995073 11.597998 12.666252 13.861521 47.85533   100
于 2013-08-06T21:03:50.637 に答える
3

本当に使用できるようにしたい場合...

test <- list( seq(10), seq(5) )

descriptiveRow <- function(x) {
  res <- c(length(x), mean(x), sd(x), min(x), max(x))
  names(res) <- c("N","Mean","SD","Min","Max")
  res
}

descriptive <- function( ... ) {
  l <- list(...)
  res <- as.data.frame( lapply( l, descriptiveRow ) )
  colnames(res) <- seq(ncol(res))
  res
}

descriptive(test[[1]], test[[2]])

> descriptive(test[[1]], test[[2]])
            1        2
N    10.00000 5.000000
Mean  5.50000 3.000000
SD    3.02765 1.581139
Min   1.00000 1.000000
Max  10.00000 5.000000
于 2013-08-06T21:03:52.753 に答える
3

list関数の引数への入力として を指定し、 on each を使用しsapplyて各データの統計を取得できます。

descriptive <- function(ll) {
    N <- sapply(ll, length)
    mean <- sapply(ll, mean)
    sd <- sapply(ll, sd)
    min <- sapply(ll, min)
    max <- sapply(ll, max)
    print(out <- data.frame(N, mean, sd, min, max))
}

descriptive(list(1:5, 6:10))

  N mean       sd min max
1 5    3 1.581139   1   5
2 5    8 1.581139   6  10

注: これは、入力が でdata.frameあり、data.frame のすべての列の統計が必要な場合でも機能します (内部的にはリストであるため)。

descriptive(data.frame(1:5, 6:10))
      N mean       sd min max
X1.5  5    3 1.581139   1   5
X6.10 5    8 1.581139   6  10
于 2013-08-06T21:08:01.800 に答える