J'utiliserai l'iris pour la reproductibilité

df <- iris %>% 
      mutate(Species2=Species) %>% 
      map_df(., function(x) {x[sample(c(TRUE, NA), prob = c(0.8, 0.2), size = length(x), replace = TRUE)]}) %>% 
      mutate(across(where(starts_with("Species")),as.factor))
  

J'ai créé une autre colonne Species2 et entrée au hasard NA, ce que je veux faire est de convertir toutes les valeurs non NA dans deux colonnes (Species & Species 2) en 1 & NA dans ces deux colonnes en 0

J'ai pensé à utiliser across & comme .numeric pour cela, mais cela ne fonctionne pas.

 df %>% mutate(across(where(starts_with("Species")),as.numeric))
-1
Vaibhav Singh 2 sept. 2020 à 12:06

2 réponses

Meilleure réponse

Dans dplyr, vous pouvez faire:

library(dplyr)
df %>% mutate(across(starts_with("Species"), ~as.integer(!is.na(.))))

En base R, cela peut être fait comme:

cols <- grep('^Species', names(df))
df[cols] <- +(!is.na(df[cols]))
2
Ronak Shah 2 sept. 2020 à 09:11

Que diriez-vous d'utiliser

df_NA<-which(df==NA)
df_Val<-which(df>=0)
df[df_NA]<-0
df[df_Val]<-1
1
D.J 2 sept. 2020 à 09:11