0

Rでfisher.testをやりたいです。

分割表のデータが既にあります (別の file.txt にあります)。

したい:

  1. ファイルを入力して、名前に従ってそれらを照合します。
  2. テスト用に一致したファイル データを入力します。

-すべてのファイルは次のようになります。

 56
 989

すべてのファイルには 2 つの行しかありません (#1 が発生し、#2 が発生しません)。

-ファイル名は次のとおりです。

Anna_50.txt
Anna_100.txt
Anna_200.txt
Ben_50.txt
Ben_100.txt
Ben_200.txt

-Anna_50 と Ben_50 のフィッシャー テストを実行したい。Anna_100 & Ben_100 など:

-質問:

files <- list.files()

ファイル内の Anna_50 と Ben_50 を一致させる方法;

入力の順序として行列を作成する方法はトリッキーです。

table <- matrix(c(Anna_50_Occ, Ben_50_Occ, Anna_50_NonOn, Ben_50_NonO)2,2)

これをすべてのファイルに対して実行するにはどうすればよいですか?

回答をお待ちしております。これをできるだけ明確にしようとしました - 私は本当にこれが必要ですが、まだ不明な点がある場合は、遠慮なく質問してください。

4

1 に答える 1

6

私はトリックを行うべきいくつかのコードを持っています。ただし、ファイルがないため、最後の部分が失敗する可能性があります。

アイデアは次のとおりです。まず、から番号を読み取りますfiles。次に、ファイル名を含む2つのベクトルを作成します。1つはすべてのAnnaファイル用、もう1つはBenファイル用です。次に、これらのオブジェクトの2つでフィッシャーの直接確率検定を実行するための関数を作成します。最終的な魔法はmapply、ファイル名の2つのベクトルを同時に繰り返すことによって実現されます。

files <- c("Anna_50.txt", "Anna_100.txt", "Anna_200.txt", "Ben_50.txt", 
    "Ben_100.txt", "Ben_200.txt")

# get the numbers from the filenames
numbers <- vapply(strsplit(vapply(strsplit(files, "\\."), "[", i = 1, ""), "_"), "[", i = 2, "")

# only use those numbers that appear two times:
t.num <- table(numbers)
valid.num <- dimnames(t.num)[[1]][t.num == 2]

# make vector for Anna and Ben (that now have the same ordering)
f.anna <- paste("Anna_", valid.num, ".txt", sep = "")
f.ben <- paste("Ben_", valid.num, ".txt", sep = "")

#Now you can use mapply with a suitable function
# Did not check it as I dont have the files, but the logic should become clear:
run.fisher <- function(file1, file2) {
    d1 <- scan(file1)
    d2 <- scan(file2)
    d.matrix <- matrix(c(d1, d2), byrow = TRUE)
    fisher.test(d.matrix)
}

# now use mapply to obtain a list with all results:

mapply(run.fisher, f.anna, f.ben)

更新:実際には、ファイル名から番号を取得するための行を次のように減らすことができます。

files <- vapply(strsplit(files, "[\\._]"), "[", i = 2, "")
于 2012-04-20T10:01:53.150 に答える