2017-05-04 11 views
0

私は192列のデータフレームを持っています。私は、ペアリングに基づいて一致する列を引くことによって96列のデータフレームを作りたいと思っています。ペアリング情報は、データフレームPairingの列Matchにあります。列Posは、減算するデータフレームの列名を部分文字列として照合します。ペアの列を引く

Pairingのペア情報を使用して、どの列を減算するかを特定するにはどうすればよいですか。

> Pairing 
Match    Pos 
Control_70   001_A01 
Control_56   001_A02 
    Case_70   001_A03 
    Case_56   001_A04 
Control_21   001_A05 
    Case_21   001_A06 


> head(matures.cpm.spike.batch[,1:6]) 
       001_A01_S1 001_A02_S2 001_A03_S3 001_A04_S4 001_A05_S5 001_A06_S6 
hsa-let-7a-5p 16.566813 11.415796 12.400252 22.701457 8.864882 20.442599 
hsa-let-7b-5p 15.574190 11.107133 12.196465 17.954547 8.527478 25.788286 
hsa-let-7c-5p 5.976763 4.372978 5.984685 9.821348 6.341252 7.480211 
hsa-let-7d-3p 16.508818 10.697730 11.001534 18.375286 7.583910 24.974774 
hsa-let-7d-5p 13.273824 5.134547 9.456675 11.567230 7.096485 13.294108 
hsa-let-7f-5p 13.900711 9.804384 11.481614 20.002110 7.878241 17.295909 
+1

それはどのように不明です列をペアにする不必要な情報(ペアリングで不要な列を意味する)をすべて削除し、実用的な例を示す必要があります。 –

+0

が更新されました。これは実用的な例として機能するかもしれません – user2300940

+0

あなたの 'Pairing $ Pos'はあなたのデータに表示されたヘッダーと一致しません。また、データを貼り付けるのではなく、両方のデータを提供することができれば、多くの役に立ちます。 [Rの再現性の高いサンプルを作成する方法](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

答えて

1

私はすべてのケースに対して正確に1つのコントロールがあり、その逆の場合もあると想定しています。 Pairing data.frameを変換してケースとコントロールを整列させるのが最も簡単なようでした。それが完了したら、必要なデータフレームを作成するだけです。念のため

## First, recreate your data 
Pairing = read.table(text="Match    Pos 
Control_70   001_A01 
Control_56   001_A02 
    Case_70   001_A03 
    Case_56   001_A04 
Control_21   001_A05 
    Case_21   001_A06", 
header=TRUE) 

matures.cpm.spike.batch = read.table(text=" 001_A01_S1 001_A02_S2 001_A03_S3 001_A04_S4 001_A05_S5 001_A06_S6 
hsa-let-7a-5p 16.566813 11.415796 12.400252 22.701457 8.864882 20.442599 
hsa-let-7b-5p 15.574190 11.107133 12.196465 17.954547 8.527478 25.788286 
hsa-let-7c-5p 5.976763 4.372978 5.984685 9.821348 6.341252 7.480211 
hsa-let-7d-3p 16.508818 10.697730 11.001534 18.375286 7.583910 24.974774 
hsa-let-7d-5p 13.273824 5.134547 9.456675 11.567230 7.096485 13.294108 
hsa-let-7f-5p 13.900711 9.804384 11.481614 20.002110 7.878241 17.295909", 
header=TRUE) 

## Build Matches to replace your Pairing 
Control = Pairing[grep("Control", Pairing$Match),] 
Control = Control[order(Control$Match),] 
Case = Pairing[grep("Case", Pairing$Match),] 
Case = Case[order(Case$Match),] 
Matches = cbind(Control, Case) 

# Uses Matches to build desired data.frame 
Diffs = data.frame(matures.cpm.spike.batch[, Matches[1,4]] - 
     matures.cpm.spike.batch[, Matches[1,2]]) 
colnames(Diffs)[1] = sub("Control", "Diff", Matches[1,1]) 
for(i in 2:nrow(Matches)) { 
    Diffs[,i] = matures.cpm.spike.batch[, Matches[i,4]] - 
     matures.cpm.spike.batch[, Matches[i,2]] 
    colnames(Diffs)[i] = sub("Control", "Diff", Matches[i,1]) 
} 

## Result 
    Diff_21 Diff_56 Diff_70 
1 11.577717 11.285661 -4.166561 
2 17.260808 6.847414 -3.377725 
3 1.138959 5.448370 0.007922 
4 17.390864 7.677556 -5.507284 
5 6.197623 6.432683 -3.817149 
6 9.417668 10.197726 -2.419097 
+0

どのようにして、元のデータフレームからコルネームを作成しますか? – user2300940

+0

元のデータフレームの列数は192です。新しいデータフレームには96があります。どの列名が必要ですか?コントロールかケース? – G5W

0

、異なるアプローチ:

我々は、ケースおよびコントロールのための別々の列で、変更され、一致するデータフレームを必要としています:

library(tidyr) 
library(reshape2) 

P <- Pairing %>% 
    separate(Match, into = c("cc", "ind"), sep = "_") %>% 
    dcast(ind ~ cc, value.var = "Pos") 

P:

ind Case Control 
1 21 001_A06 001_A05 
2 56 001_A04 001_A02 
3 70 001_A03 001_A01 

colnamesmatures.cpm.spike.batchPで一致名:

colnames(df):

[1] "001_A01" "001_A02" "001_A03" "001_A04" "001_A05" "001_A06" 

今、私たちは単に以下のようにそれを終えることができます。

case <- df[, P$Case] 
control <- df[, P$Control] 
res <- case - control 

res:

   001_A06 001_A04 001_A03 
hsa-let-7a-5p 11.577717 11.285661 -4.166561 
hsa-let-7b-5p 17.260808 6.847414 -3.377725 
hsa-let-7c-5p 1.138959 5.448370 0.007922 
hsa-let-7d-3p 17.390864 7.677556 -5.507284 
hsa-let-7d-5p 6.197623 6.432683 -3.817149 
hsa-let-7f-5p 9.417668 10.197726 -2.419097 
関連する問題