3

R 内のデータに対して 2 サンプル t 検定を実行したいと考えています。2 つの高次元データ フレームが与えられた場合、一致する列 (ヘッダー内の文字列 colnames()) をすべての行で何らかの形でループし、次のテストを実行する必要があります。各列ペア - それぞれ df1 と df2 から 1 つ。問題は、データ フレームの列が正しい順序になっていないことです。つまり、df1 フォームの col1 が df2 の col1 と一致せず、df2 には df1 に存在しない追加の列があります。私はそのようなタスクに R を使用したことがなく、t 検定のデータ フレームで一致する列のペアを見つけるための高速で便利なソリューションがあるかどうか疑問に思います。

for ループについて考えましたが、これは大きなデータ フレームには非常に非効率的だと思います。

よろしくお願いします。

*編集済み-------2つの小さなデータフレームの例、df1とdf2--------------------------------

****df1****

"Row\Column"    "A2"    "A1"    "A4"    "A3"
"id_1"           10      20      0       40
"id_2"           5       15      25      35
"id_3"           8       0       12      16
"id_4"           17      25      0       40

****df2****

"Row\Column"    "A3"    "A8"    "A5"    "A6"    "A1"    "A7"    "A4"    "A2"
"id_1"           0       2       0       4       0       1       2       3
"id_2"           1       5       8       3       4       5       6       7
"id_3"           2       10      6       9       8       9       10      11
"id_4"           7       2       10      2       55      0       0       0
"id_5"           0       1       0       0       9       1       3       4
"id_6"           8       0       1       2       7       2       3       0  

一致する列は、df2 の列名と一致する df1 の列名に他なりません。たとえば、df1 と df2 の 2 つの一致する列は、「A1」と「A1」、「A2」と「A2」などです...

4

2 に答える 2

4

mapplyあなたが探している機能です。
の列がdata.frame一致した場合は、単に使用できます

mapply(t.test, df1, df2)

ただし、そうではないため、 のどの列が のどの列と一致するかを何らかの方法で識別する必要がありdf1ますdf2。幸いなことに、 のインデックス作成オプションは巧妙で、列名のベクトル (コレクションR)をフィードすると、指定された順序でそれらの列が返されます。これにより、生活が楽になります。

# find the matching names
## this will give you those names in df1 that are also in df2
## and *only* such names (ie, strict intersect)
matchingNames <- names(df1)[names(df1) %in% names(df2)]

ベクトルを df1 と df2 のそれぞれの列へのインデックスとして matchingNames使用するとどうなるか見てみましょう(列の順序にも注意してください)。matchingNames

df1[, matchingNames]
df2[, matchingNames]
matchingNames    

したがって、適切に一致した列を持つ 2 つの data.frames ができました。これを使用して繰り返し使用できますmapply

## mapply will apply a function to each data.frame, one pair of columns at a time

## The first argument to `mapply` is your function, in this example, `t.test`
## The second and third arguments are the data.frames (or lists) to simultaneously iterate over
mapply(t.test, df1[, matchingNames], df2[, matchingNames])
于 2013-04-07T17:13:13.207 に答える
0

再現可能な例がなければ、良い答えを出すのは非常に困難です。列の意味も定義する必要がありmatchingます。

これは、いくつかの列名が共通している 2 つの data.frames の例です。

df1 <- matrix(sample(1:100,5*5,rep=TRUE),ncol=5,nrow=5)
df2 <- matrix(sample(1:100,5*8,rep=TRUE),ncol=8,nrow=5)
colnames(df1) <- letters[6:10]
colnames(df2) <- rev(letters[1:8])

t.test次に、たとえば出力を p 値と自由度に制限するために、 のラッパーを定義します。

f <- function(x,y){
  test <- t.test(x,y)
  data.frame(df   = test$parameter,
                    pval = test$p.value)
}

次に、使用sapplyする共通の列を反復処理しますintersect

sapply(intersect(colnames(df1),colnames(df2)), 
                 function(x) f(df1[,x], df2[,x]))

     f         g         h        
df   7.85416   6.800044  7.508915 
pval 0.5792354 0.2225824 0.4392895
于 2013-04-07T17:20:31.397 に答える