2016-07-04 31 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 ... 

ie我想爲每個ID和每個SNPIndex兩列 - 每列有一個A1/A2值一行。

我真的很感謝你的幫忙!

+1

歡迎來到SO!我能幫你做幾件事嗎?最重要的是,您可以使用您在問題中創建的數據,「輸入」數據集或使用內置數據集中的數據將這個數據轉換成可重複使用的示例?您是否也請查看我們的格式指南並檢查以前的答案? –

回答

0

我敢肯定,A)這是一個重複和b)我的代碼可以簡化,但是這似乎做你所追求的

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

您可以使用一個循環的reshape包的dcast

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

其實我在呈現數據集時犯了一個錯誤。我已經糾正了上面的帖子,你能幫我修改這段代碼以適合我的實際數據集嗎?請,我瘋了;) –