2016-02-04 20 views
3

轉換成兩列的矩陣爲循環我有一個單一的列數據幀 - 例如數據:如何單個列數據使用條件/ R中

1       >PROKKA_00002 Alpha-ketoglutarate permease 
2  MTESSITERGAPELADTRRRIWAIVGASSGNLVEWFDFYVYSFCSLYFAHIFFPSGNTTT 
3  QLLQTAGVFAAGFLMRPIGGWLFGRIADRRGRKTSMLISVCMMCFGSLVIACLPGYAVIG 
4           >PROKKA_00003 lipoprotein 
5  MRTIIVIASLLLTGCSHMANDAWSGQDKAQHFLASAMLSAAGNEYAQHQGYSRDRSAAIG 

字母每個序列相關聯的「>」在它上面行。我需要一個兩列的數據框,第一列中的「>」以行開頭,第二列中的各個字母連接成一個序列。這是我到目前爲止已經試過:

y <- matrix(0,5836,2) #empty matrix with 5836 rows and two columns 
z <- 0 
for(i in 1:nrow(df)){ 
    if((grepl(pattern = "^>", x = df)) == TRUE){ #tried to set the conditional "if a line starts with ">", execute code" 
    z <- z + 1 
    y[z,1] <- paste(df[i]) 
    } else{ 
    y[z,2] <- paste(df[i], collapse = "") 
    } 
} 

我會用as.data.frame最終轉換矩陣Y回data.frame,但我的循環狀態越來越錯誤:意外「}」「 }」。我也不確定我的條件是否正確。誰能幫忙?這將不勝感激!

+0

這看起來像FASTA格式。你可以檢查'Biostrings :: readDNAStringSet'。見例如[這裏](http://stackoverflow.com/questions/21263636/how-to-read-fasta-into-dataframe-and-extract-subsequences-of-fasta-file-in-r)。 – Henrik

+0

looka fasta文件給我,您可以使用專用包如biostrings來讀取fasta文件。或者如果你想寫自己的,可以看看這些如何在其他包裝中完成 – Ananta

+0

非常感謝你們倆! – PTrinh

回答

1

雖然我將與包粘,這裏是一個解決方案

初始化數據

mydf <- data.frame(x=c(">PROKKA_00002 Alpha-ketoglutarate","MTESSITERGAPEL", "MTESSITERGAPEL",">PROKKA_00003 lipoprotein", "MTESSITERGAPEL" ,"MRTIIVIASLLLT"), stringsAsFactors = F) 

過程

ind <- grep(">", mydf$x) 
temp<-data.frame(ind=ind, from=ind+1, to=c((ind-1)[-1], nrow(mydf))) 

seqs<-rep(NA, length(ind)) 
for(i in 1:length(ind)) { 
    seqs[i]<-paste(mydf$x[temp$from[i]:temp$to[i]], collapse="") 
} 

fastatable<-data.frame(name=gsub(">", "", mydf[ind,1]), sequence=seqs) 


> fastatable 
           name      sequence 
1 PROKKA_00002 Alpha-ketoglutarate MTESSITERGAPELMTESSITERGAPEL 
2   PROKKA_00003 lipoprotein MTESSITERGAPELMRTIIVIASLLLT 
0

嘗試使用列標題創建具有目標符號的行的索引。然後分割該索引上的數據。調用cumsum(ind1)[!ind1]首先通過將邏輯向量強制轉換爲數字來創建一個id行,然後消除帶有列標題的行。

ind1 <- grepl(">", mydf$x) 

#split data on the index created 
newdf <- data.frame(mydf$x[ind1][cumsum(ind1)], mydf$x)[!ind1,] 

#Add names 
names(newdf) <- c("Name", "Value") 
newdf 
#   Name    Value 
# 2 >PROKKA_00002 Alpha-ketoglutarate 
# 3 >PROKKA_00002  MTESSITERGAPEL 
# 5 >PROKKA_00003   lipoprotein 
# 6 >PROKKA_00003  MRTIIVIASLLLT 

數據

mydf <- data.frame(x=c(">PROKKA_00002","Alpha-ketoglutarate","MTESSITERGAPEL", ">PROKKA_00003", "lipoprotein" ,"MRTIIVIASLLLT")) 
+0

我相信,期望的數據框是不同的,OP可能期望你的列在不同行的第一列中出現 – Ananta

+0

真。我現在在手機上,所以我不能更新15分鐘,直到通過CPU。在此期間隨意編輯 –

+0

修正了輸出。 –

0

您可以使用plyr做到這一點,如果你能分配單元號到你行適當:

library(plyr) 
df <- data.frame(v1=c(">PROKKA_00002 Alpha-ketoglutarate permease", 
        "MTESSITERGAPELADTRRRIWAIVGASSGNLVEWFDFYVYSFCSLYFAHIFFPSGNTTT", 
        "QLLQTAGVFAAGFLMRPIGGWLFGRIADRRGRKTSMLISVCMMCFGSLVIACLPGYAVIG", 
        ">PROKKA_00003 lipoprotein", 
        "MRTIIVIASLLLTGCSHMANDAWSGQDKAQHFLASAMLSAAGNEYAQHQGYSRDRSAAIG")) 
df$hasMark <- ifelse(grepl(">",df$v1,fixed=TRUE),1, 0) 
df$section <- cumsum(df$hasMark) 

t <- ddply(df, "section", function(x){ 
    data.frame(v2=head(x,1),v3=paste(x$v1[2:nrow(x)], collapse='')) 
}) 

t <- subset(t, select=-c(section,v2.hasMark,v2.section)) #drop the extra columns 

如果再視圖「 t'我相信這就是你在你的原帖中尋找的東西

相關問題