我有一个包含几千行的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单独的文件。
非常感谢您的回答
答案 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")