所以 - 我有一个看起来像这样的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值。
我真的很感谢你的帮助!
答案 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
诀窍是使用虚拟向量使其折叠成单行,然后可以将其绑定到所需的数据框中。