2017-10-17 8 views
0

J'ai une question débutante pour les utilisateurs R confirmés :-). Je un objet de classe « locus » avec des lignes correspondant à des individus, et les colonnes correspondant à des génotypes à différents loci SNP (+ 1 colonne pour l'information de la population):Problèmes exécutant la commande 'ddply' de la bibliothèque R de plyr

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

I ont 12 populations qui sont définis dans ma colonne "population". Je voudrais calculer la distance génotypique par paires entre les individus dans chaque population.

Avec un seul bruit, la commande serait:

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

Il retourne un objet de la classe « dist » avec des différences entre les individus par paires.

Cependant, je voudrais diviser mon dataframe en fonction des 12 niveaux des colonnes "population", et factoriser cette procédure en utilisant une fonction 'apply'.

J'ai essayé la fonction 'ddply' du plyr bibliothèque:

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

Malheureusement, cette commande renvoie un message d'erreur:

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

'ANTE' être le premier pop qui apparaît dans la base de données, je suppose que le fractionnement mal tourné en quelque sorte. Aussi, je suppose qu'il pourrait y avoir un problème avec le fait que le résultat dist.gene est un objet 'dist' et non une trame de données réelle.

Existe-t-il une meilleure façon d'utiliser ddply ici? Ou une autre approche pour diviser mon dataframe tout en appliquant la commande dist.gene? Sinon je suppose que je vais juste créer une dataframe d'entrée par pop ... :-) Pas pratique si on a un grand nombre de pops !!

Merci pour toute aide!

Tous les meilleurs,

Chrys

Répondre

1

pour cette solution?

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