4 votes

Utilisation de R pour insérer une valeur pour les données manquantes avec une valeur provenant d'un autre cadre de données

Tous,

J'ai une question que je crains d'être trop piétonne pour être posée ici, mais les recherches que j'ai effectuées ailleurs m'ont égaré. Il se peut que je n'utilise pas les bons termes de recherche.

J'ai un cadre de données de panel (pays-année) dans R avec quelques valeurs manquantes sur une variable donnée. J'essaie de les imputer avec la valeur d'un autre vecteur dans un autre cadre de données. Voici une illustration de ce que j'essaie de faire.

Supposons Data est la base de données d'intérêt, qui contient des valeurs manquantes sur un vecteur donné que j'essaie d'imputer à partir d'une autre base de données de donneurs. Voici à quoi cela ressemble.

country    year      x
  70       1920    9.234
  70       1921    9.234
  70       1922    9.234
  70       1923    9.234
  70       1924    9.234
  80       1920      NA
  80       1921      NA
  80       1922      NA
  80       1923      NA
  80       1924      NA
  90       1920    7.562
  90       1921    7.562
  90       1922    7.562
  90       1923    7.562
  90       1924    7.562

Il s'agirait de la Donor qui a une valeur pour country == 80

country      x
  70       9.234
  80       1.523
  90       7.562

J'essaie de trouver un moyen transparent d'automatiser cela, au-delà d'une commande de Data$x[Data$country == 80] <- 1.523 . Il y a beaucoup de pays où l'on manque d'informations. x .

Il peut être utile de préciser qu'un simple merge serait le plus simple, mais pas nécessairement approprié à ce que j'essaie de faire. Dans certains pays, il y aura des variations sur les x au cours des différentes années. En fait, ce que j'essaie d'accomplir, c'est une commande qui dit que si la valeur de x est absente de Data pour toutes les années pour un pays donné, prendre la valeur correspondante pour le pays à partir de l'indicateur Donor et les coller sur toutes les années-pays comme une sorte de "meilleure estimation".

Merci de votre contribution. Je pense qu'il s'agit d'une question de débutant, mais je ne connaissais pas les bons termes pour la poser.

Le code reproductible pour les données ci-dessus est le suivant.

country <- c(70,70,70,70,70,80,80,80,80,80,90,90,90,90,90)
year <- c(1920,1921,1922,1923,1924,1920,1921,1922,1923,1924,1920,1921,1922,1923,1924)
x <- c(9.234,9.234,9.234,9.234,9.234,NA,NA,NA,NA,NA,7.562,7.562,7.562,7.562,7.562)

Data=data.frame(country=country,year=year,x=x)
summary(Data)

country <- c(70,80,90)
x <- c(9.234,1.523,7.562)
Donor=data.frame(country=country,x=x)
summary(Donor)

5voto

topchef Points 7473

Utilisation merge :

r = merge(Data, Donor, by="country", suffixes=c(".Data", ".Donor"))
Data$x = ifelse(is.na(r$x.Data), r$x.Donor, r$x.Data)

Si, pour une raison quelconque, l'idée d'écraser tous des valeurs de x semble mauvaise, alors utilisez which pour écraser uniquement les NA (avec la même fusion) :

r = merge(Data, Donor, by="country", suffixes=c(".Data", ".Donor"))
na.idx = which(is.na(Data$x))
Data[na.idx,"x"] = r[na.idx,"x.Donor"]

5voto

alexwhan Points 5632

Voici une option qui devrait fonctionner de manière générale :

#Get the vector of countries with missing x
country.na <- Data$country[is.na(Data$x)]
#Get corresponding location of x in Donor
index <- sapply(country.na, function(x) which(Donor$country == x))
#Replace NA values with corresponding values in Donor
Data$x[is.na(Data$x)] <- Donor$x[index]
Data
#    country year     x
# 1       70 1920 9.234
# 2       70 1921 9.234
# 3       70 1922 9.234
# 4       70 1923 9.234
# 5       70 1924 9.234
# 6       80 1920 1.523
# 7       80 1921 1.523
# 8       80 1922 1.523
# 9       80 1923 1.523
# 10      80 1924 1.523
# 11      90 1920 7.562
# 12      90 1921 7.562
# 13      90 1922 7.562
# 14      90 1923 7.562
# 15      90 1924 7.562

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X