重塑R中的数据:按行和行合并到列

时间:2016-07-04 13:46:17

标签: r dataframe reshape

所以 - 我有一个看起来像这样的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有一行,每个SNPIndex有两列 - 每列有一个A1 / A2值。

我真的很感谢你的帮助!

2 个答案:

答案 0 :(得分: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 )

答案 1 :(得分: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

诀窍是使用虚拟向量使其折叠成单行,然后可以将其绑定到所需的数据框中。