【问题标题】:Execute code on different subsets在不同的子集上执行代码
【发布时间】:2016-09-26 05:07:53
【问题描述】:

我有一个包含数千行的 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)

此代码有效。但是,我想应用此代码,而无需手动将每个“子囊菌”替换为“担子菌”、“未识别”、“壶菌”。

我应该使用什么功能?我应该如何使用它?我一直在为sapply()repeat() 苦苦挣扎,但还没有走远。

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

非常感谢您的回答

【问题讨论】:

    标签: r subset repeat lapply


    【解决方案1】:

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

    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")
    

    【讨论】:

    • 与其把子集代码放在函数中,写一个假设子集已经完成的函数是很常见的,然后它可以很好地与dplyr::dodata.table甚至@987654324一起工作@ 和 lapply.
    • @Gregor 那将是一个好主意,谢谢 :) 我尝试这样重写它,但最终命名正在写入的表有点尴尬(据我所知)反正)。不过下次我会记住的。
    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多