2012-04-20 7 views
0

は、私はすでに(別file.txtなどに)分割表のデータを持っているR.fisher.test多くのファイル入力

でfisher.testをしたいです。

私がしたい:

  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 

-IはAnna_50 & Ben_50のためのフィッシャーテストを行いたいです。 Anna_100 & Ben_100など:

-Questions:

files <- list.files() 

ファイルにAnna_50とBen_50を一致させる方法。

入力の順序として行列を作成する方法は難しいです。

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

これをどのように実行するか?

あなたの答えを楽しみにしています。これをできるだけ明確にしようとしました - 私は本当にこれが必要ですが、まだ不明なことがある場合は躊躇しないでください。

答えて

5

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

考え方は次のとおりです。まず、filesから数字を読みます。次に、ファイル名を含む2つのベクトルを作成します。 1つはすべてのAnnaファイル用、もう1つはBenファイル用です。次に、これらのオブジェクトの2つに対してFisherテストを実行するための関数を作成します。最後の魔法は、ファイル名の二つのベクトル上で同時に反復mapplyによって達成される:

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) 

UPDATE:

files <- vapply(strsplit(files, "[\\._]"), "[", i = 2, "") 
は実際にあなたがファイル名から番号を取得するためのラインを減らすことができます
関連する問題