0

次のデータを含むデータフレームがあります。

age.cat ds.cat  finalstate
<65     AGN     dead
<65     AGN     alive
<65     PC      alive
65+     AMI     alive
65+     PC      dead
<65     AMI     alive

ds.cat因子変数のすべてのレベルについて、変数age.catfinalstate変数のフィッシャー検定を実行する必要があります。

私はいくつかの方法でそれをやろうとしましたが、必要なものが得られませんでした. 次の R コードでは、目的の結果が得られません。

library(descr)
# 1 syntax - doesn't work
by(split(df, df$ds.cat), CrossTable(age.cat, finalstate, prop.chisq = FALSE, fisher = TRUE))
# 2 syntax - doesn't work
sapply( split(df, df$ds.cat), function(x) CrossTable(age.cat, finalstate, prop.chisq = FALSE, fisher = TRUE) )
# 3 syntax - doesn't work
for(i in 1:nlevels(ds.cat)){
    curcat <- subset(df, ds.cat == ds.cat[i])
    CrossTable(age.cat[ds.cat == ds.cat[i]], finalstate[ds.cat == ds.cat[i]], prop.chisq = FALSE, fisher = TRUE, data = curcat)
}

因子変数のすべてのレベルに対してフィッシャー検定age.catと変数を実行する方法を誰か提案できますか?finalstateds.cat

解決しました!

皆様本当にありがとうございました!

このコードCrossTableはエラーを生成します

Error in chisq.test(t, correct = FALSE) : 
'x' must at least have 2 elements

しかし、@BenBolkerのおかげで、ベースfisher.test関数はコードでうまく機能します

l <- split(arf.mort, arf.mort$ds.cat)
lapply(l, function(x) fisher.test(x$age.cat, x$finalstate))

うまく機能するだけでなく、

by(arf.mort, arf.mort$ds.cat, function(x){ fisher.test(x$age.cat, x$finalstate) })
4

2 に答える 2

0

アイリス データセット (R の起動時に読み込まれます) を操作していて、最初の 2 列の CrossTable を Species で分割したいとします。これはあなたがそれを行う方法です:

#whatever a crosstable is
CrossTable <- function(x, y){
    #something tricky
    sum(x+y)
}

by(iris, iris$Species, function(x){ CrossTable(x[1], x[2]) })
于 2013-03-06T18:09:02.167 に答える
0

使用しているパッケージについて言及する必要があります ( gmodels)。開発されたすべてのパッケージを把握しているわけではありません。これはうまくいくようで、あなたが探しているものだと思います。

require(gmodels)
l <- split(df, df$ds.cat)
lapply(l, function(x) CrossTable(x$age.cat, x$finalstate, 
            prop.chisq = FALSE, fisher = TRUE)

それはたくさんのテーブルを提供します(S-plus形式に似ていると思います)。

于 2013-03-06T18:06:08.383 に答える