循环函数中的因子变量的级别

时间:2015-01-20 01:56:11

标签: r lapply

我有一个数据帧,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]])

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

1 个答案:

答案 0 :(得分: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:如果您要处理大型数据集,请考虑在allele.count <- colSums(data[,1:(ncol(data)-2)])函数中使用get_maf,而不是使用现在慢得多的allele.count <- apply(data[,1:(ncol(data)-2)],2,sum)