遍历函数中因子变量的水平
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)
。
我有一个数据框 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)
。