Je souhaite mettre en œuvre une "dernière observation reportée vers l'avant" pour un jeu de données que je travaille sur lequel a des valeurs manquantes à la fin de celui-ci.
Voici un code simple pour le faire (question après cela):
a <- data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA)) a t(apply(a, 1, LOCF)) # will make a mess
7 Réponses :
Ceci existe déjà:
library(zoo) na.locf(data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA)))
+1 et rseek.org Bien sûr, saisit immédiatement cela comme des premiers résultats.
Mon offre de neeking pas - Merci Shane. Mais je crains que cela ne fasse pas le travail. (Il remplit la colonne 3, au lieu de chaque ligne)
Vous auriez également pu trouver ceci si vous avez recherché Stackoverflow.com pour [R] LOCF CODE>.
Bonjour Shane, je n'ai pas non plus de trouver une solution dans cette recherche (bien que ce fil soit bien: Stackoverflow.com/Questtions/1782704/... )
Regardez la réponse acceptée à ce fil. C'est ce que je faisais appelé. Je ne pense pas que cette question soit une duplication car l'autre intervenant posait des vecteurs et que vous posiez des cadres de données, mais ils sont très étroitement liés (et la réponse est la même).
Salut Shane, la fonction peut être utilisée comme ceci: T (na.locf (T (Data.frame (représentant (REP (A ", 4), 1: 4,1: 4, C (1, NA, NA, NA) )))) Mais il ne "résoudre" pas la question, car je devrais passer par la "matrice" résultante et le remettre à une donnée. Et merci d'avoir pris le temps d'aider :) Tal
Oh ... tu veux porter des valeurs de colonne "avant"? Ce n'est généralement pas ce que font les gens. Une "observation" est une valeur de ligne dans R, alors que LOCF signifie porter des valeurs de ligne vers le bas. Vous portez des valeurs entre les colonnes. Je ne peux même pas imaginer une circonstance dans laquelle on le ferait?
Salut Shane, c'est très simple. J'ai une large (au lieu de long) data.frame. Je peux la tourner longtemps et utiliser une fonction de l'autre si du fil. Le seul problème avec ce serait le cas d'une première valeur manquante ...
Si la première valeur est manquante, vous pouvez faire un jugement sur ce qu'il faut faire pour le gérer. Aucune fonction ne résoudra ce problème pour vous. Vous aurez besoin de quitter le tout comme manquant ou de définir une première valeur par défaut (comme zéro, par exemple).
Je ne vois pas pourquoi tourner la matrice en retour sur une donnée.fraine avec data.frame (t (na.locf (t (dat)))) code> devrait être un problème. Et suivant
na.locf (dat) code> avec
na.locf (DAT, FromSlast = true) code> doit transporter des observations suivantes vers l'arrière (NOCB) et remplir d'abord les valeurs manquantes. Non? Donc:
data.frame (T (na.locf (na.locf (t dat)), FromLast = t))) code>
J'ai fini par résoudre cela en utilisant une boucle:
fillInTheBlanks <- function(S) { L <- !is.na(S) c(S[L][1], S[L])[cumsum(L)+1] } LOCF.DF <- function(xx) { # won't work well if the first observation is NA orig.class <- lapply(xx, class) new.xx <- data.frame(t( apply(xx,1, fillInTheBlanks) )) for(i in seq_along(orig.class)) { if(orig.class[[i]] == "factor") new.xx[,i] <- as.factor(new.xx[,i]) if(orig.class[[i]] == "numeric") new.xx[,i] <- as.numeric(new.xx[,i]) if(orig.class[[i]] == "integer") new.xx[,i] <- as.integer(new.xx[,i]) } #t(na.locf(t(a))) return(new.xx) } a <- data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA)) LOCF.DF(a)
Cette question est vieille mais pour la postérité ... La meilleure solution consiste à utiliser un emballage de données.Table avec le rouleau = t. p>
remplir avec un exemple
au lieu de appliquer () code> Vous pouvez utiliser
lapply () code>, puis transformer la liste résultante sur
data.frame code>.
LOCF <- function(x) {
# Last Observation Carried Forward (for a left to right series)
LOCF <- max(which(!is.na(x))) # the location of the Last Observation to Carry Forward
x[LOCF:length(x)] <- x[LOCF]
return(x)
}
a <- data.frame(rep("a",4), 1:4, 1:4, c(1, NA, NA, NA))
a
data.frame(lapply(a, LOCF))
Il y a un tas de packages mettant en œuvre exactement cette fonctionnalité. (avec la même fonctionnalité de base, mais certaines différences d'options supplémentaires) p>
Tiryyvere a également une fonction équivalente de remplissage (). Ce serait génial d'avoir quelque chose de rapide dans les données.
Si vous ne voulez pas charger un gros paquet comme zoo uniquement pour la fonction Na.locf, voici une solution courte qui fonctionne également s'il y a quelques NAS de premier plan dans le vecteur d'entrée.
na.locf <- function(x) { v <- !is.na(x) c(NA, x[v])[cumsum(v)+1] }
J'aime mieux cette solution. Si vous souhaitez l'appliquer à un data.frame code> Comme dans la question initiale, vous pouvez l'utiliser via
A [] = na.locf) code>.
Ajout du nouveau titsyr :: remplissage () code> Fonction pour effectuer la dernière observation dans une colonne à remplir
NA code> S:
a <- data.frame(col1 = rep("a",4), col2 = 1:4,
col3 = 1:4, col4 = c(1,NA,NA,NA))
a
# col1 col2 col3 col4
# 1 a 1 1 1
# 2 a 2 2 NA
# 3 a 3 3 NA
# 4 a 4 4 NA
a %>% tidyr::fill(col4)
# col1 col2 col3 col4
# 1 a 1 1 1
# 2 a 2 2 1
# 3 a 3 3 1
# 4 a 4 4 1