2016-10-21 12 views
2

私は私の「メイン」data.frame 10の列および行の数千を持っている4つの異なる細胞マーカー マッチ組み合わせが

combinations_df 

    FITC Cy3 TX_RED Cy5 
a 0 0  0 0 
b 1 0  0 0 
c 0 1  0 0 
d 1 1  0 0 
e 0 0  1 0 
f 1 0  1 0 
g 0 1  1 0 
h 1 1  1 0 
i 0 0  0 1 
j 1 0  0 1 
k 0 1  0 1 
l 1 1  0 1 
m 0 0  1 1 
n 1 0  1 1 
o 0 1  1 1 
p 1 1  1 1 

data.frame 16との異なる組み合わせを有します。

> main_df 
    a b FITC d Cy3 f TX_RED h Cy5 j 
1 0 1 1 1 1 0  1 1 1 1 
2 0 1 0 1 1 0  1 0 1 1 
3 1 1 0 0 0 1  1 0 0 0 
4 0 1 1 1 1 0  1 1 1 1 
5 0 0 0 0 0 0  0 0 0 0 
.... 

Iは、main_dfの各行と比較するcombinations_dfからすべての可能な16個の組み合わせを使用します。それから私は、カラム11

サンプル出力

> phenotype 
[1] "g" "i" "a" "p" "g" 

私は各main_df行を通じて各combinations_df行をチェックするforループ内whileループをやって考えたとしてmain_dfからcbind後でに新しいvectorを作成したいです。

それはうまくいくような音ですが、main_dfには1 000 000行近くありますので、誰かがより良いアイデアを持っているかどうかを見たいと思っていました。

編集:私はcombinations_dfを列3,5,7,9と比較することを忘れていました。main_dfからです。彼らは同じ名前を持っていますが、明らかではないかもしれません。

EDIT:

+1

各dfの4つのセルマーカー列を連結してから、新しい連結列を使用してマッチまたはマージを行うとどうなりますか – emilliman5

+0

私はあなたを@ emilliman5に追いかけているとは確信していません。私は比較的新しくR – jesusgarciab

答えて

2

dplyr解決策は非常に簡単です。

# phenotype FITC Cy3 TX_RED Cy5 
#1   a 0 0  0 0 
#2   b 1 0  0 0 
#3   c 0 1  0 0 
#4   d 1 1  0 0 
# etc 

dplyrあなたが複数の変数に参加することができますので、ここから、それは表現型を調べるためにワンライナーです:まず、あなたは、このような明示的な変数としてcombinations_dfphenotypeを配置する必要があります。

library(dplyr) 
left_join(main_df, combinations_df, by=c("FITC", "Cy3", "TX_RED", "Cy5")) 

# a b FITC d Cy3 f TX_RED h Cy5 j phenotype 
#1 0 1 1 1 1 0  1 1 1 1   p 
#2 0 1 0 1 1 0  1 0 1 1   o 
#3 1 1 0 0 0 1  1 0 0 0   e 
#4 0 1 1 1 1 0  1 1 1 1   p 
#5 0 0 0 0 0 0  0 0 0 0   a 

私はもともとあなたがtidyr::uniteでの列を連結する必要があるだろうと思ったが、これはそうではありませんでした。

2

その非常にエレガントしかし、この方法ではうまく機能しない存在しなければならないノー「t」のために、サンプルデータ出力を変ります。ループ内にループはありませんので、うまく動くはずです。データフレームの行を使用して一致させようとしているかもしれませんが、ループを一掃することはできますが、これはわかりやすい方法でした。パッケージplyrまたはdata.tableをご覧ください。この種のもののための非常に強力なパッケージ。

  main_text=NULL 
      for(i in 1:length(main_df[,1])){ 
      main_text[i]<-paste(main_df[i,3],main_df[i,5],main_df[i,7],main_df[i,9],sep="") 
      } 
      comb_text=NULL 
      for(i in 1:length(combinations_df[,1])){ 
      comb_text[i]<-paste(combinations_df[i,1],combinations_df[i,2],combinations_df[i,3],combinations_df[i,4],sep="") 
      } 

      rownames(combinations_df)[match(main_text,comb_text)] 
1

私の結果はあなたのものとは異なります。なぜなら、combination_dfに "t"がないからです。あなたが望むなら、あなたは新しい列を割り当てることなくそれを行うことができます。これは主に説明のためのものです。

combination_df <- read.table("Documents/comb.txt.txt", header=T) 
main_df <- read.table("Documents/main.txt", header=T) 

main_df 
combination_df 
main_df$key <- do.call(paste0, main_df[,c(3,5,7,9)]) 
combination_df$key <- do.call(paste0, combination_df) 

rownames(combination_df)[match(main_df$key, combination_df$key)] 
+0

Haです'do.call'以外の答えは基本的に同じです。偉大な心は同じように考える:D。 forループを使用する習慣から抜け出すことが本当に必要です。 'lapply'、' do.call'などのものはもっと良く見えます。 – CCurtis

+0

良いキャッチ!私はちょうどaからpへのランダムなサンプルのサンプルを生成しようとしましたが、明らかに私はしませんでした... – jesusgarciab