0

重複の可能性:
他の列値に対応するデータの特定のセクションの列値の平均化

グループごとにデータセットを分析したいと思います。データは次のように設定されます。

Group   Result   cens
   A    1.3        1
   A    2.4        0
   A    2.1        0
   B    1.2        1
   B    1.7        0
   B    1.9        0

以下を計算する関数があります

sumStats = function(obs, cens) {
detects = obs[cens==0]
nondetects= obs[cens=1]
mean.detects=mean(detects) 
return(mean.detects) }

もちろん、これは説明のための単純な関数です。グループごとにデータを分析するために2つの変数を入力する必要があるこの自家製の関数を使用できるようにする関数がRにありますか。

by関数を調べましたが、一度に1列のデータを取り込むようです。

4

2 に答える 2

2

データをインポートします。

test <- read.table(header=TRUE,textConnection("Group   Result   cens
   A    1.3        1
   A    2.4        0
   A    2.1        0
   B    1.2        1
   B    1.7        0
   B    1.9        0"))

これを行うには多くの方法がありますが、by具体的に使用すると、次のようなことができます(データフレームがと呼ばれると仮定しますtest)。

by(test,test$Group,function(x) mean(x$Result[x$cens==1]))

Resultsこれにより、各グループ内のすべての値の平均が得られます。cens==1

出力は次のようになります。

test$Group: A
[1] 1.3
----------------------------------------------------------------------
test$Group: B
[1] 1.2

これが関数でどのように機能するかを理解するのに役立つように、次のことを考慮してください。各グループの内容にbyステートメントを尋ねるだけで、次のようになります。return

> by(test,test$Group,function(x) return(x))
test$Group: A
  Group Result cens
1     A    1.3    1
2     A    2.4    0
3     A    2.1    0
----------------------------------------------------------------------- 
test$Group: B
  Group Result cens
4     B    1.2    1
5     B    1.7    0
6     B    1.9    0

...これは実際には各グループの行のみを含む2つのデータフレームであり、リストとして保存されます。これは、分割される前と同じように、各グループのdata.framesの一部にアクセスできることを意味します。上記xの関数は、各グループのサブデータフレーム全体を参照しています。xつまり、関数に渡すための一部として個々の変数を使用できます-基本的な例:

> by(test,test$Group,function(x) x$Result)
test$Group: A
[1] 1.3 2.4 2.1
-------------------------------------------------------------------
test$Group: B
[1] 1.2 1.7 1.9

さて、ついにあなたの特定の質問に答えることに取り掛かる!2つの入力の平均を別々に取得する関数の例をとると:

sumStats = function(var1, var2) {
   res1 <- mean(var1)
   res2 <- mean(var2)
   output <- c(res1,res2)
   return(output)
}

両方のby平均を取得するためにこれを使用して呼び出すことができます。Resultcens

> by(test,test$Group,function(x) sumStats(x$Result,x$cens))
test$Group: A
[1] 1.9333333 0.3333333
---------------------------------------------------------------------- 
test$Group: B
[1] 1.6000000 0.3333333

お役に立てば幸いです。

于 2012-12-10T00:03:03.280 に答える
2

集計関数はこのために設計されています。

 aggregate(dfrm$cens, dfrm["group"], FUN-mean)

一度に複数の列の平均値を取得できます。各列は「グループ」内にあります。

aggregate(dfrm[ , c("Result", "cens") ], dfrm["group"], FUN=mean)
于 2012-12-10T05:35:22.317 に答える