2016-07-04 13 views
0
に行と列でマージ

だから - 私はこのようになりますdata.frameを持っている:形状変更データ:列

ID SNPIndex A1 A2 
ID1 1 A B 
ID1 2 B B 
ID1 3 A B 
ID2 1 A B 
ID2 2 B B 
ID2 3 A A 
ID3 1 B B 
.... 

、それはこのように見えるようにするために私が希望:

ID 1_A1 1_A2 2_A1 2_A2 3_A1 3_A2 
ID1 A B B B A B 
ID2 A B B B A A 
ID3 ... 

つまり、IDごとに1行、SNPIndexごとに2列、A1/A2値が1つの各列が必要です。

私は本当にあなたの助けに感謝します!

+1

ようこそ!私はあなたにいくつかのことをさせることができますか?最も重要なのは、疑問の中で作成したデータ、 'dput'するデータ、または組み込みのデータセットを使って、これを再現可能な例にしてください。また、フォーマットガイドラインを見直して事前に回答してください。 –

答えて

0

I a)は、これが重複であり、b)私のコードを簡素化することができることを確信しているが、これはあなたがあなたがreshapeパッケージのdcastループ内を使用することができます

dat <- data.frame(ID = c("ID1" , "ID2" , "ID3") , 
        SNPIndex = c(1,2,3) , 
        A1 = c("A", "B" , "A") , 
        A2 = c("B" , "B" , "B") , stringsAsFactors = F) 

library(tidyr) 
library(dplyr) 


dat %>% 
    gather(KEY, VALUE , A1, A2) %>% 
    mutate(KEY = paste0(SNPIndex , "_", KEY) ) %>% 
    select(-SNPIndex , - ID) %>% 
    spread(KEY , VALUE) 
+0

ありがとう!そして、質問を複製するための私の謝罪! –

+0

実際に私は間違って私の質問を述べました...私のデータセットは実際には(編集版)のように見えます。 心からお詫び申し上げます! –

0

の後にある何に見えます。

library(reshape2) 
df <- data.frame(ID=c("ID1","ID2","ID3"), 
       SNPIndex=1:3, 
       A1=c("A","B","A"), 
       A2=c("B","B","B") 
       ) 

dummy <- rep(1,3) 
number_of_As <- 2 

for (i in 1:number_of_As) { 
    rawdf <- dcast(df, dummy ~ SNPIndex, value.var=paste0("A",i)) 
    rawdf <- rawdf[,c(-1)] 
    colnames(rawdf) <- paste0(1:3,paste0("_A",i)) 
    if (i == 1) { 
    newdf <- rawdf 
    } else { 
    newdf <- cbind(newdf,rawdf) 
    } 
} 

これは、あなたが望む結果を得られます:トリックは、それはあなたが、あなたの希望のデータフレームにバインドすることができ、単一の行、につぶれるように、ダミーのベクターを使用することです

> newdf 
    1_A1 2_A1 3_A1 1_A2 2_A2 3_A2 
1 A B A B B B 

を。

+0

実際に私はデータセットを提示するときに間違いを犯しました。上記の投稿を修正しました。実際のデータセットに合わせてこのコードを変更する手助けをしてもらえますか?私は夢中になってしまいます。 –

関連する問題