J'essaie d'utiliser changer les classes de plusieurs vecteurs à la fois, en utilisant %>% mutate_if
dans un jeu de données vide de vecteurs logiques. Je peux les changer un par un avec as.factor()
.
Mon ensemble de données ressemble à ceci:
library(dplyr) G <- as.factor(levels(as.factor(id))) dat <- as.data.frame(G) datprep <- data.frame(matrix(vector(), length(G), length(levels(as.factor(code))) ) ) colnames(datprep) = levels(as.factor(code)) datD <- cbind(datprep, datD) # columns are logical, shall be factors. datD %>% mutate_if(is.logical, as.factor)
Maintenant, je vous poste tout mon code si cela aide:
ID code pc01 cat pc02 dog pc03 cat pc04 horse pc01 dog pc02 horse
Aucune suggestion?
3 Réponses :
Si j'ai bien compris votre problème (pas sûr car il n'y a pas de colonne logique dans votre exemple, juste un caractère), vous devez inclure le ~ et. avec mutate_if (et bien d'autres):
library(dplyr) df <- dplyr::tibble(ID = c("pc01", "pc02", "pc03", "pc04", "pc01", "pc02"), code = c("cat", "dog", "cat", "horse", "dog", "horse")) df %>% dplyr::mutate_if(is.character, ~ as.factor(.)) ID code <fct> <fct> 1 pc01 cat 2 pc02 dog 3 pc03 cat 4 pc04 horse 5 pc01 dog 6 pc02 horse
Le tilde "~" sinalise une fonction (le résultat est à gauche) et le "." is représente n'importe quelle colonne ... J'ai utilisé is.character () car c'est ce que sont vos colonnes d'exemple, mais vous pouvez le changer en tout autre type de vérification
s'ils sont logiques, modifiez simplement le caractère is.character en is.logical et cela devrait fonctionner
Dans la nouvelle version de dplyr
, nous pouvons également utiliser à across
library(dplyr) df <- df %>% mutate(across(where(is.character), factor))
Dans la base R, vous pouvez faire:
df <- rapply(df,factor,"character", how="replace")
ou même
df <- type.convert(df)
s'avère, le problème était vector () dans la mise en place de data.frame.