2017-05-10 4 views
0

Disons que j'ai deux colonnes, une de localisation et une de dates, dont certaines sont manquantes.R Remplacez <NA> par la date, si la valeur des autres colonnes est

City  Date 
1 Sheffield 19/05/1985 
2 Sheffield 21/06/1986 
3 Sheffield <NA> 
4 Newcastle 14/07/1996 
5 Newcastle <NA> 
6 Liverpool 12/11/2001 

Je dois remplacer les dates manquantes avec une date fictive (disons 21/06/1866), mais seulement pour la ville de Sheffield.

Dans la syntaxe SQL serait:

UPDATE Dataframe SET Date = "21/06/1866" WHERE city="Sheffield" 

En R J'ai essayé ce qui suit avec peu (ou pas) succès:

filter <- (Dataframe$Date == is.na(Dataframe$Date) & Dataframe$City =="Sheffield") 
Dataframe[filter,"Date"] <- as.Date("1866/06/21") 

Cependant, cela me jette l'erreur suivante:

Error in [<-.data.frame (*tmp* , filter, "Date", value = -37814) : missing values are not allowed in subscripted assignments of data frames

Vous avez des idées? J'ai l'impression que c'est probablement incroyablement facile mais je ne vois tout simplement pas comment c'est fait pour le moment.

+0

Avez-vous essayé dataframe $ Date [(is.na (dataframe $ Date)) et (dataframe $ Ville == Sheffield) = as.Date ("21/06/1866", « % Y /% m /% d ") –

+0

@JustinKlevs il manque un _] _, potentiellement un _, _ non? – patrick

+0

@patrick oui, une faute de frappe de ma part –

Répondre

0
df[df$City == "Sheffield" & is.na(df$Date), "Date"] = as.Date("1866/06/21", format = "%Y/%m/%d") 

> df 
     City  Date 
1 Sheffield 1985-05-19 
2 Sheffield 1986-06-21 
3 Sheffield 1866-06-21 
4 Newcastle 1996-07-14 
5 Newcastle  <NA> 
6 Liverpool 2001-11-12 

Si vous regardez votre filtre, il retourne simplement FALSE.

> filter <- (df$Date == is.na(df$Date) & df$City =="Sheffield") 
> filter 
[1] FALSE FALSE FALSE FALSE FALSE FALSE 

Vous avez juste besoin d'écrire is.na(df$Date) ce retourne un vecteur logique indiquant si la date est NA. Ce que vous avez écrit les contrôles de date est VRAI ou FAUX (retourné de is.na(df$Date)), ce qui n'est jamais le cas parce que c'est une date.

> filter <- (is.na(df$Date) & df$City =="Sheffield") 
> filter 
[1] FALSE FALSE TRUE FALSE FALSE FALSE