データをインポートします。
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
平均を取得するためにこれを使用して呼び出すことができます。Result
cens
> 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
お役に立てば幸いです。