わかりにくいタイトルで申し訳ありませんが、これは説明が少し難しいです。基本的に、次のような 2 つのデータ テーブルがあります。
df1 <- data.frame(SNP=c("W", "X", "Y", "Z"),
Gene.ID=c("A", "B", "C", "B"), pval=NA)
df2 <- data.frame(W=c(1, 0, 1), X=c(1, 1, 0), Y=c(0, 0, 1), Z=c(1, 0, 1),
A=c(3.5, 2.5, 3.5), C=c(4.5, 2.5, 1.5), B=c(1.5, 2.5, 1.5))
したがって、df1 のすべてのエントリは、df2 の列名に対応します。私の目標は、df1$pval に t 検定の p 値を入力することです。df1 のすべての行について、df1$SNP の値に一致する df2 列を比較する t 検定を実行し、それを df1$Gene.ID の値に一致する df2 列と比較します。
たとえば、df1 の最初の行では、df2$W と df2$A を比較し、結果の p 値を df1[1, 3] 内に返します。2 行目では、df2$X と df2$B を比較し、df1[2, 3] の p 値を返します。つまり、次のようなものです。
for (i in 1:nrow(df1)){
test <- t.test(df2[,which(colnames(df2)==df1[i, 1]] ~ df2[,which(colnames(df2)==df1[i, 2]])
df1[i, 3] <- test$p.value
}
colnamesただし、単一の列名だけでなく、関数を使用して複数の列名しか選択できないため、これは機能しません。これを回避する方法についての提案は大歓迎です。または、より簡単な方法を念頭に置いている場合は、それも素晴らしいでしょう。