2015-11-13 2 views
1

Je voudrais effectuer une interpolation linéaire dans une variable d'une trame de données qui prend en compte: 1) le décalage temporel entre les deux points, 2) le moment où les données ont été prises et 3) l'individu pris pour mesurer la variable.R: Interpolation des NA par le groupe

Par exemple, dans la prochaine dataframe:

df <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3), 
      Individuals=c(1,1,1,1,1,1,1,2,2,2), 
      Value=c(1, 2, 3, NA, 5, NA, 7, 5, NA, 7)) 
    df 

Je voudrais obtenir:

result <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3), 
       Individuals=c(1,1,1,1,1,1,1,2,2,2), 
       Value=c(1, 2, 3, 4, 5, 6, 7, 5, 5.5, 6)) 
result 

Je ne peux pas utiliser exclusivement la fonction na.approx du paquet zoo parce que toutes les observations ne sont pas consécutives, certains les observations appartiennent à un individu et les autres observations appartiennent à d'autres. La raison est parce que si le deuxième individu aurait sa première obstruction avec NA et j'utiliserais exclusivement la fonction na.approx, j'utiliserais l'information du individual==1 pour interpoler le NA du individual==2 (par exemple le cadre de données suivant aurait telerror)

df_2 <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3), 
       Individuals=c(1,1,1,1,1,1,1,2,2,2), 
       Value=c(1, 2, 3, NA, 5, NA, 7, NA, 5, 7)) 
    df_2 

J'ai essayé d'utiliser les paquets zoo et dplyr:

library(dplyr) 
library(zoo) 
proof <- df %>% 
    group_by(Individuals) %>% 
    na.approx(df$Value) 

Mais je ne peux pas effectuer group_by dans un objet zoo. Savez-vous comment interpoler NA valeurs dans une variable par groupes?

Merci à l'avance,

+0

Pourriez-vous s'il vous plaît expliquer un peu ce que votre sortie désirée serait? De plus, à quoi sert le groupe 'Ear_tag'? Cette colonne n'existe pas dans la base de données que vous avez fournie? – Pash101

Répondre

3

Utilisez data.frame, plutôt que cbind pour créer vos données. cbind renvoie une matrice, mais vous avez besoin d'une trame de données pour dplyr. Ensuite, utilisez na.approx à l'intérieur de mutate. J'ai commenté group_by, car vous n'avez pas fourni la variable de regroupement dans vos données, mais l'approche devrait fonctionner une fois que vous avez ajouté la variable de regroupement à la trame de données.

df <- data.frame(time=c(1,2,3,4,5,6,7,1,2,3), 
      Individuals=c(1,1,1,1,1,1,1,2,2,2), 
      Value=c(NA, 2, 3, NA, 5, NA, 7, 8, NA, 10)) 

library(dplyr) 
library(zoo) 

df %>% 
    group_by(Individuals) %>% 
    mutate(ValueInterp = na.approx(Value, na.rm=FALSE)) 

    time Individuals Value ValueInterp 
1  1   1 NA   NA 
2  2   1  2   2 
3  3   1  3   3 
4  4   1 NA   4 
5  5   1  5   5 
6  6   1 NA   6 
7  7   1  7   7 
8  1   2  8   8 
9  2   2 NA   9 
10 3   2 10   10 
+0

Très bien, Cela fonctionne pour l'exemple 'df', mais cela ne fonctionne pas quand' NA' se trouve dans la première ou la dernière observation comme dans l'exemple proposé dans 'df_2'. Est-il possible que le code interpole au moins les données pour les observations qui ne sont pas la première ou la dernière observation? – Ruben

+1

Ajoutez simplement 'na.rm = FALSE' (voir le code mis à jour). Ensuite, les valeurs «NA» avant et arrière seront conservées dans le vecteur résultant. – eipi10

+0

Et comment puis-je effectuer l'interpolation pour l'ensemble de données entier si j'ai 1 ou 2 observations pour un individu et que ces mesures sont des NA? Par exemple dans ce datafrate: 'df <- data.frame (temps = c (1,2,3,4,5,6,7,1,2,3), Individus = c (3,3, 1,1,1,1,1,2,2,2), Valeur = c (NA, 2, 3, NA, 5, NA, 7, 8, NA, 10)) ' Je voudrais obtenir l'interpolation pour le reste des données, mais quand j'ai appliqué ce code R dit: 'Erreur dans approx (x [! na], y [! na], xout, ...): besoin d'au moins deux valeurs non-NA à interpoler ». Y at-il un moyen de ne pas prendre en compte les cas impossibles? – Ruben

3

Nous pouvons utiliser data.table

library(data.table) 
library(zoo) 
setDT(df1)[, ValueInterp:= na.approx(Value, na.rm=TRUE), by = Individual] 
+1

Oui, cela fonctionne dans les cas où le «NA» ne se trouve pas dans la première ou la dernière obstruction d'un individu, mais cela ne fonctionne pas lorsque le «NA» est la première ou la dernière observation. Cependant le pire est que data.table fournit un résultat fournissant des éléments (message d'avertissement) et exécutant mal l'assignation ce qui est dangereux si vous exécutez un gros code où vous n'êtes pas capable de vérifier tous les messages d'avertissement. – Ruben

+0

@Ruben Pour 'df_2', quelle est la sortie attendue? – akrun

+0

La sortie doit avoir l'interpolation de tous les 'NAs 'sauf que c'est la première ou la dernière observation d'un individu. – Ruben