在不同的子集上执行代码
Execute code on different subsets
我有一个有几千行的 data.frame。我正在对这些数据的子集应用几行代码。
我在列“mergeorder$phylum”中有 4 个子集:
[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)
此代码有效。但是,我想应用此代码而不用手动将每个 "ascomycota" 替换为 "basidiomycota"、"unidentified"、"chytridiomycota".
我应该使用什么功能?我应该如何使用它?我一直在与 sapply()
、repeat()
作斗争,但没有取得太大进展。
最终结果应该执行整个代码并导出 csv 单独文件。
非常感谢您的回答
通常可以编写一次性处理所有子集的代码。但是,您正在做的事情非常复杂。最好的办法可能是将所有这些都收集到一个函数中,然后 运行 每个子集的函数。像这样:
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")
我有一个有几千行的 data.frame。我正在对这些数据的子集应用几行代码。
我在列“mergeorder$phylum”中有 4 个子集:
[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)
此代码有效。但是,我想应用此代码而不用手动将每个 "ascomycota" 替换为 "basidiomycota"、"unidentified"、"chytridiomycota".
我应该使用什么功能?我应该如何使用它?我一直在与 sapply()
、repeat()
作斗争,但没有取得太大进展。
最终结果应该执行整个代码并导出 csv 单独文件。
非常感谢您的回答
通常可以编写一次性处理所有子集的代码。但是,您正在做的事情非常复杂。最好的办法可能是将所有这些都收集到一个函数中,然后 运行 每个子集的函数。像这样:
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")