遍历函数中因子变量的水平

loop over levels of a factor variable in a function

我有一个数据框 dat,其中协变量位点编码为具有 31 个不同级别的因子。

cas_1_sitea_586754968 0 0 1 2 0 sitea 
con_65_sitea_568859302 1 0 2 1 1 siteb
cas_9_siteb_0799700 0 0 0 0 0 siteb 
con_siteb_THR84569 2 0 0 1 0 sitea

我有一个函数,当我一次将它应用于一个站点变量时,它会起作用:

get_maf <- function(data){
    allele.count <- apply(data[,1:(ncol(data)-2)],2,sum)
    maf <- allele.count/(2*nrow(data))
    out <- paste((unique(data$site)),"_jp.maf",sep="")
    write.table(maf, out, col.names=F, quote=F)
}

但是,当我尝试使用 lapply 遍历 31 个站点中的每个站点中的数据时,如下所示:

lapply(unique(dat$site), get_maf, data = dat)    

我得到一个错误:lapply(unique(jp$site), get_maf_jp, data = jp) Error in FUN(c("aber", "ajsz", "asrb", "buls", "cati", "caws", "cims", : unused argument (c("aber", "ajsz", "asrb", "buls", "cati", "caws", "cims", "clo3", "cou3", "denm", "dubl", "edin", "egcu", "ersw", "gras", "irwt", "lie2", "lie5", "mgs2", "msaf", "munc", "pewb", "pews", "s234", "swe1", "swe5", "swe6", "top8", "ucla", "umeb", "umes")[[1]])

非常感谢任何对我在这里做错的见解。

lapply(unique(dat$site), get_maf, data = dat) 表达式的问题在于它试图将两个参数传递给 get_maf:第一个来自 lapply,第二个来自 data=dat。您可以这样修复它:lapply(unique(dat$site), function(s) {get_maf(data=dat[dat$site==s,]}).

或者,您可以使用

library(dplyr)
dat %>% group_by(site) %>% get_maf

PS:如果您要处理大型数据集,请考虑在 get_maf 函数中使用 allele.count <- colSums(data[,1:(ncol(data)-2)]),而不是现在使用的更慢的 allele.count <- apply(data[,1:(ncol(data)-2)],2,sum)