J'ai un ensemble de données de métriques d'image de site Web qui nécessitent l'écrasement des données NA . Auparavant, j'ai joint deux tables sur un website_index . Cependant, je dois maintenant revenir en arrière et ajouter plusieurs colonnes de données pour plusieurs lignes. Je ne sais pas si je peux à nouveau rejoindre la table (cela créera-t-il des doublons car certaines des données sont déjà là?) Dois-je utiliser une autre méthode?
Je dois ajouter que cela couvre des milliers de lignes de données. Le website_index est répété plusieurs fois, et il y a plus de 20 colonnes de valeurs que j'essaie d'ajouter. Je préfère donc ne pas utiliser c () pour ajouter manuellement des valeurs de colonne à la ligne, car je pourrais faire une erreur de copie de toutes les valeurs.
Un exemple de l'ensemble de données que j'essaie de mettre à jour
website_index metric1 metric2 1 "value1" "value2" 2 "value3" "value4" 3 "red" "green" 4 "blue" "green"
Je souhaite que l'ensemble de données ressemble à ceci
website_index metric1 metric2 1 NA NA 2 NA NA 3 "red" "green" 4 "blue" "green"
3 Réponses :
Voici un moyen de remplacer NA par "value".
dat <- read.table(text = "website_index metric1 metric2
1 NA NA
2 NA NA
3 'red' 'green'
4 'blue' 'green'",
header = TRUE, stringsAsFactors = FALSE)
DONNÉES
dat[is.na(dat)] <- "value" dat # website_index metric1 metric2 # 1 1 value value # 2 2 value value # 3 3 red green # 4 4 blue green`
Pour les ensembles de données extrêmement volumineux où la mémoire et la vitesse sont nécessaires, la solution suivante utilisant data.table devrait être plus rapide. Pour les scénarios normaux, utilisez la solution de @www
library(data.table) setDT(dat) for (j in names(dat)) set(dat, which(is.na(dat[[j]])), j, "value")
Merci! Je me rends compte que ma question a été formulée vaguement avec eux tous disant «valeur» - j'ai besoin de plusieurs valeurs différentes à ajouter dans les colonnes, donc cela ne fonctionnera pas pour moi.
MISE À JOUR DES MODIFICATIONS DE MATCH OP
Une solution utilisant la base pour les boucles.
#example data frame
x <- data.frame(web = c(1,2,3,4), metrc = c(NA,NA,'red','blue'), metrc2 = c(NA, NA, 'green','green'), stringsAsFactors = FALSE)
#initializing empty vector
l <- c()
#creating "value" with a count of NAs in data frame
for(i in 1:sum(is.na(x))){
l[[i]] <- paste0('value',i)
}
#nested for loop that check each row, column, fills in first item from the vector
#to the NA, and removes item from vectors.
for(i in 1:nrow(x)){
for(j in 1:ncol(x)){
if(is.na(x[i,j])) {
x[i,j] <- l[[1]]
l <- l[l!=l[1]]
}
}
}
Est-ce le moyen le plus efficace? Douteux. Cependant, je ne suis pas vraiment sûr que cela réponde à votre vraie question lorsque vous avez mentionné le fait de rejoindre des tables. Peut-être que l'ajout d'un exemple de table que vous voudriez rejoindre comme @Frank l'a suggéré vous aiderait?
Vous voudrez probablement compléter l'exemple avec quelques informations sur la règle qui mène à la sortie souhaitée. Peut-être avez-vous une autre table à montrer qui correspond à cet exemple (puisque vous mentionnez une jointure)?