2017-10-17 41 views
0

我对确认的R用户有一些新手问题:-)。我有类的“基因座”的对象与对应于个人的行,和对应于在不同的SNP位点的基因型列(+人口信息1列):运行plyr R库的'ddply'命令的问题

gen.loc Allelic data frame: 283 individuals 151 loci 1 additional variable

as.data.frame(gen.loc) population PBA10091 PBA10106 PBA10242 PBA10272 PBA11037 PBA11455 PBA11744 001 ANTE 01/02 01/01 01/01 02/02 02/02 02/02 01/01
002 ANTE 01/01 01/01 01/01 02/02 01/02 02/02 01/02
003 ANTE 01/01 02/02 01/01 02/02 02/02 01/02 01/01
004 ANTE 01/01 01/01 01/01 02/02 02/02 01/02 01/01
005 ANTE 01/02 02/02 01/01 02/02 02/02 02/02 01/02
006 ANTE 01/01 02/02 01/02 01/02 01/02 02/02 01/01

我中定义的12群我的“人口”专栏。我想计算每个人群内个体之间的成对基因型距离。

只需一个流行的命令是:

d <- dist.gene(gen.loc, method="pairwise", pairwise.deletion = TRUE, variance = FALSE)

它返回与个人之间的配对差异类“DIST”的对象。

但是,我想根据“人口”列的12个级别来分割我的数据框,并使用'apply'函数将此过程分解。

我试图plyr库的 'ddply' 功能:

ddply(as.data.frame(gen.loc), as.data.frame(gen.loc)$population, function(e) dist.gene(e, method="pairwise", pairwise.deletion = TRUE, variance = FALSE))

不幸的是该命令返回一个错误消息:

Error in eval(expr, envir, enclos) : object 'ANTE' not found

'ANTE' 是所述第一出现在数据框中的流行,我猜想分裂出了问题。另外,我猜测结果可能存在问题,因为结果是“dist”对象而不是实际的R数据帧。

有没有更好的方法在这里使用ddply?或者应用dist.gene命令时分割我的数据帧的另一种方法?否则,我想我会只是创建一个输入数据帧每个弹出... :-)不方便,如果一个有大量的流行,但!

感谢您的帮助!

一切顺利,

Chrys

回答

1

试试这个?

df <- as.data.frame(gen.loc) 
split.df <- split(df, df$population) # split data frame into list by distinct population 
result <- lapply(split.df, function(i) dist.gene(i, method="pairwise", pairwise.deletion = TRUE, variance = FALSE)) # iterate through list and calculate pairwise distance