1

m と epi の 2 つのテーブルがあります。epi テーブルには m 列の名前が含まれています。

  head(m[,1:6])
         Geno    11DPW      8266         80647        146207    146227
1 SB002XSB012 0.87181895    G/G           C/C          G/G        A/A
2 SB002XSB018         Na    G/G           C/T          G/G        A/A
3 SB002XSB044   1.057744    G/G           C/C          G/G        A/A
4 SB002XSB051 1.64736814    G/G           C/C          G/G        A/A
5 SB002XSB067 0.69987475    A/G           C/C          G/G        A/G
6 SB002XSB073 0.60552177    A/G           C/C          G/G        A/G

    > dim(m)

[1]   167 28234
and 
head(epi)
       SNP1      SNP2
1  7789543   12846898
2 12846898  7789543
3 24862913  4603896
4  4603896   24862913
5 50592569  7789543
6 27293494   57162585

    dim(epi)

[1] 561   2

エピの各行を取り、m の 11DPW でこれら 2 列の tow-way anova を実行したいと思います。私は試した

f<-function (x) {
 anova(lm (as.numeric(m$"11DPW")~ m[,epi[x,1]]*m[,epi[x,2]]))
 }
apply(epi,1,f)

エラーが発生しました: [.data.frame(m, , epi[x, 1]) のエラー: 未定義の列が選択されました 何か提案はありますか? ありがとう、イムリ

4

2 に答える 2

1

列名として整数を使用することによる複雑さはしばらく脇に置いておきます (つまり、この問題が正しく処理されていると仮定します)。

に示されている列が存在しない場合でも、"undefined columns selected"エラーが発生します。epim

offendingElements <- !sapply(epi, "%in%", colnames(m))

# since an offending element likely disqualifies the row from the anova test, identify the whole row
offendingRows <- which(offendingElements) %% nrow(epi)   

# perform your apply statement over:
epi[-offendingRows, ]



APPLY で使用される関数のクリーンアップ

apply(epi, 1, f)の各呼び出しに渡すものを使用するfと、の行全体になりepiます。したがって、epi[x, 1]あなたが望む結果が得られません。たとえば、apply ステートメントの 7 回目の反復でxは、 と同等ですepi[7, ]xしたがって、最初の列を取得するには、直接インデックスを付けるだけです。したがって、あなたの関数では:

Instead of       epi[x, 1]   and    epi[x, 2]
You want to use  x[[1]]      and    x[[2]]

それが最初の部分です。次に、整数を列名として扱う必要があります。非常に重要: m[, 7823] を使用すると、m の 7823 番目の列が得られます。必ず整数を文字列に変換する必要があります。これは、(必然的に) 7823 番目の列ではなく、"7823" という名前の列が必要であることを示します。

これに使用as.characterします:

   m[, as.character(x[[1]])]

すべてを一緒に入れて

offendingElements <- !sapply(epi, "%in%", colnames(m))
offendingRows <- which(offendingElements) %% nrow(epi)   

apply(epi[-offendingRows, ], 1, function (x) 
   anova( lm ( as.numeric(m$"11DPW") ~ m[, as.character(x[[1]]) ] * m[, as.character(x[[2]]) ] ))
)




名前を処理する別の方法があります。最も簡単なのは、適切な文字列にすることです。

# clean up the elements in epi
epi.clean <- sapply(epi, make.names)

# clean up m's column names
colnames(m) <- make.names(colnames(m))

# use epi.clean  in your apply statement.  Dont forget offendingRows
apply(epi.clean[-offendingRows, ], 1, function (x) 
   anova( lm ( as.numeric(m$"11DPW") ~ m[, x[[1]] ] * m[, x[[2]] ] ))
)
于 2012-12-17T19:35:52.850 に答える
0

の値epiは数値であると思われますが、使用したいのは同等の文字列です。これは、列名mが文字列であるためです (これらの文字列は数字で構成されています)。代わりにこれを試してください:

m[[as.character(epi[x,])]] (等)

[[オペレーターは風変わりですが、とてもクールです。

于 2012-12-17T13:34:27.233 に答える