2016-09-15 1 views
0

J'ai un ensemble de données qui comprend la quantité d'individus de différentes lignées génétiques (ligne) de mouches des fruits dans l'étude (n) et la quantité qui a survécu (vivant). Ceci est divisé en échantillons répétés (rep) Ce cadre de données ressemble à ceci:Convertir les données de fraction de survie en données de comptage binomiale dans R?

line rep n alive trt 
1 21 1 5 2  control 
2 21 2 5 4  control 
3 26 1 5 1  control 
4 26 2 5 4  control 

Afin d'adapter un modèle binomial, je veux convertir la fraction (vivant/n) pour compter les données. Jusqu'à présent, je l'ai fait manuellement (ce qui est très laborieux) la création d'une trame de données comme ceci:

line rep trt  surv 
1  21 1 control 0 
2  21 1 control 0 
3  21 1 control 0 
4  21 1 control 1 
5  21 1 control 1 
6  21 2 control 0 
7  21 2 control 1 
8  21 2 control 1 
9  21 2 control 1 
10 21 2 control 1 
11 26 1 control 0 
12 26 1 control 0 
13 26 1 control 0 
14 26 1 control 0 
15 26 1 control 1 
16 26 2 control 0 
17 26 2 control 1 
18 26 2 control 1 
19 26 2 control 1 
20 26 2 control 1 

Cela me permet de créer un modèle où la survie est la variable de réponse, l'interaction entre la ligne et le traitement (TRT) est un effet majeur et rep est un effet aléatoire. Le modèle fonctionne, le problème est combien de temps faut-il pour générer ceci (j'ai un total de 139 lignes avec 5 reps chacun). Quelqu'un peut-il m'aider s'il vous plaît soit créer une fonction, me montrer une fonction ou un paquet qui va m'aider? Y a-t-il un moyen plus facile de faire cela?

Merci à l'avance,

Phil

Répondre

1

avec vos données d'échantillons

dd<-read.table(text=" line rep n alive trt 
1 21 1 5 2  control 
2 21 2 5 4  control 
3 26 1 5 1  control 
4 26 2 5 4  control", header=T) 

Vous pouvez utiliser dplyr et tidyr pour aider ...

bibliothèque

(dplyr) bibliothèque ( tidyr)

dd %>% mutate(dead=n-alive) %>% select(-n) %>% 
    gather(status, count, c(alive,dead)) %>% 
    slice(rep(1:n(), .$count)) %>% select(-count) %>% 
    transform(surv=ifelse(status=="alive",1,0), status=NULL) %>% 
    arrange(line, rep, trt, surv) 

Nous utilisons gather() pour créer des lignes séparées pour les surv=0 et surv=1 et nous utilisons slice() pour répliquer les lignes désirées.

+0

Monsieur Flick, merci beaucoup. Cela a fonctionné parfaitement, même pour mon grand ensemble de données. Merci beaucoup pour la réponse rapide !! – Melderon