如何在R

时间:2016-02-04 21:28:32

标签: r for-loop matrix dataframe string-concatenation

我有一个列数据框 - 示例数据:

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,但我的循环不断得到错误:意外&#39;}&#39; in&#34;}&#34;。我也不确定我的条件是否合适。有人可以帮忙吗?非常感谢!

3 个答案:

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

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

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

如果您再查看&#39;我相信这是你在原帖中所寻找的