在不同的子集

时间:2016-05-27 19:00:45

标签: r subset repeat lapply

我有一个包含几千行的data.frame。我将几行代码应用于此数据的子集。

我在一列中有4个子集" mergeorder $ phylum ":

[1] "ascomycota"      "basidiomycota"   "unidentified"   
[4] "chytridiomycota"

在每个子集上,我必须分别应用这组功能:

ascomycota<-mergeorder[mergeorder$phylum %in% c("ascomycota"), ]
group_ascomycota <- aggregate(ascomycota[,2:62], by=list(ascomycota$order), FUN=sum)

row.names(group_ascomycota)<-group_ascomycota[,1]
group_ascomycota$sum <-apply(group_ascomycota[,-1],1,sum) 

dat5 <-sweep(group_ascomycota[,2:62], 2, colSums(group_ascomycota[2:62]), '/')
dat5$sum <-apply(group_ascomycota[,-1],1,sum)
reorder_dat5 <- dat5[order(dat5$sum, decreasing=T),]

reorder_dat5$OTU_ID <- row.names(reorder_dat5)
FINITO<-reorder_dat5[1:15,]

write.table(FINITO, file="output_ITS1/ITS1_ascomycota_order_top15.csv", col.names=TRUE,row.names=FALSE, sep=",", quote=FALSE)

此代码有效。但是,我想应用此代码而无需手动替换每个&#34; ascomycota&#34;用&#34;担子菌&#34;,&#34;未识别&#34;,&#34; chytridiomycota&#34;。

我应该使用什么功能?我该怎么用?我一直在与sapply()repeat()挣扎,但还没到达。

最终结果应该执行整个代码并导出csv单独的文件。

非常感谢您的回答

1 个答案:

答案 0 :(得分:2)

通常可以编写一次性处理所有子集的代码。但是,你正在做的事情非常复杂。最好的办法可能是将所有内容收集到一个函数中,然后为每个子集运行该函数。像这样:

subset_transform <- function(subset){
  t <-mergeorder[mergeorder$phylum %in% c(subset), ]
  group_t <- aggregate(t[,2:62], by=list(t$order), FUN=sum)

  row.names(group_t)<-group_t[,1]
  group_t$sum <-apply(group_t[,-1],1,sum) 

  dat5 <-sweep(group_t[,2:62], 2, colSums(group_t[2:62]), '/')
  dat5$sum <-apply(group_t[,-1],1,sum)
  reorder_dat5 <- dat5[order(dat5$sum, decreasing=T),]

  reorder_dat5$OTU_ID <- row.names(reorder_dat5)
  FINITO<-reorder_dat5[1:15,]

  write.table(FINITO, file = paste("output_ITS1/ITS1_", subset, "_order_top15.csv"), col.names=TRUE,row.names=FALSE, sep=",", quote=FALSE)
}

subset_transform("ascomycota")
subset_transform("basidiomycota")
subset_transform("unidentified")
subset_transform("chytridiomycota")