Comment remplacer NA les valeurs dans un tableau pour les colonnes sélectionnées
Il y a beaucoup de posts sur le remplacement de NA valeurs. Je suis conscient que l'on pourrait remplacer NAs dans le tableau suivant/cadre avec le texte suivant:
x[is.na(x)]<-0
Mais, que faire si je veux de la restreindre à seulement certaines colonnes? Laissez-moi vous montrer un exemple.
D'abord, nous allons commencer avec un ensemble de données.
set.seed(1234)
x <- data.frame(a=sample(c(1,2,NA), 10, replace=T),
b=sample(c(1,2,NA), 10, replace=T),
c=sample(c(1:5,NA), 10, replace=T))
Qui donne:
a b c
1 1 NA 2
2 2 2 2
3 2 1 1
4 2 NA 1
5 NA 1 2
6 2 NA 5
7 1 1 4
8 1 1 NA
9 2 1 5
10 2 1 1
Ok, donc je ne veux limiter le remplacement de colonnes 'a' et 'b'. Ma tentative a été:
x[is.na(x), 1:2]<-0
et:
x[is.na(x[1:2])]<-0
Qui ne fonctionne pas.
Mes données.tableau tentative, où y<-data.table(x)
, a de toute évidence ne marchera jamais:
y[is.na(y[,list(a,b)]), ]
Je veux passer colonnes à l'intérieur de l'est.na argument, mais qui de toute évidence ne fonctionne pas.
Je voudrais faire cela dans un ensemble de données.cadre et un ensemble de données.table. Mon objectif final est de recoder le 1:2 0:1 dans 'a' et 'b', tout en gardant 'c' la façon dont il est, puisqu'il n'est pas une variable logique. J'ai un tas de colonnes, donc je ne veux pas le faire un par un. Et, je voudrais juste savoir comment faire cela.
Avez-vous des suggestions?
Vous devez vous connecter pour publier un commentaire.
Que vous pouvez faire:
ou mieux (à mon humble avis), utiliser des noms de variables:
Dans les deux cas,
1:2
ouc("a", "b")
peut être remplacé par un pré-définis vecteur.x[, 1:2][x[, 1:2] == 1] <- 0
x
accepter une matrice comme premier membre uniquement lors de l'assignation ? Cette fonction est documenté quelque part ? Aussi je pense que vous avez oublié de mettre une virgule avant les vecteurs avec des noms de colonne dans le deuxième exemple.[
, il va extraire les colonnes spécifiées (voir stackoverflow.com/a/21137524/1201032). J'espère que cela répond à votre question, mais à l'avenir, merci d'éviter les commentaires sur les très vieux réponses comme celui-ci; au lieu de poster une nouvelle question.In both cases, 1:2 or c("a", "b") can be replaced by a pre-defined vector.
Quand j'ai utilisé une prédéfinis vecteur comme cex[Vpredefined][is.na(x[Vpredefined])] <- 0
il me donne l'erreurx
est une matrice et non pas un ensemble de données.cadre comme ce fut le cas dans cette question?Cela fonctionne pour votre
data.table
version:Sinon, comme David Arenburg points ci-après, vous pouvez utiliser
set
(côté des avantages que vous pouvez l'utiliser soit surdata.frame
oudata.table
):y[ , (cols) := lapply(.SD, function(x){out <- x; out[is.na(out)] <- 0; out}), .SDcols = cols]
"saute" de la boucle, mais est assez laid de l'OMI. Le simple fait de mentionner depuis au moins convient le "paradigme" delapply
/.SDcols
mises à jour pourdata.table
. Je suppose qu'on pourrait aussi écrirena.to.0<-function(x){x[is.na(x)]<-0; x}
puis fairey[ , (cols) := lapply(.SD, na.to.0), .SDcols = cols]
...C'est maintenant négligeable dans tidyr avec replace_na(). La fonction s'affiche à travailler pour les données.les tables et les données.images:
Bâtiment sur @Robert McDonald
tidyr::replace_na()
réponse, voici quelquesdplyr
options pour contrôler les colonnes de laNA
s sont remplacés:Error in replace_na(., 0) : argument "value" is missing, with no default
. Toutes les suggestions de ce qu'il faut changer?Ne sais pas si c'est plus concis, mais cette fonction permettra également de trouver et de permettre le remplacement de NAs (ou une valeur que vous désirez) dans les colonnes de données.tableau:
Pour l'appliquer à:
La fonction crée une matrice de la sélection des colonnes et des lignes (coordonnées des cellules) qui répondent aux critères d'entrée (dans ce cas, est.na == TRUE).
On peut le résoudre en
data.table
façon avectidyr::repalce_na
fonction etlapply
De cette façon, nous pouvons également résoudre coller des colonnes avec
NA
chaîne. Tout d'abord, nousreplace_na(x,"")
,alors nous pouvons utiliserstringr::str_c
de combiner des colonnes!D'une colonne spécifique, il existe une alternative avec
sapply
c'est assez pratique avec {données.table} et {stringr}
FYI
cela fonctionne très bien pour moi