Mon ensemble de données comporte plusieurs colonnes portant le même nom et j'aimerais les supprimer.
Malheureusement, select (data, -Offender)
ne fonctionne pas ( Erreur: impossible de lier les données car certains arguments ont le même nom
), mais je peux N'utilisez pas janitor :: clean_names
pour surmonter cela non plus - j'ai besoin que les noms de colonne restants restent inchangés.
J'ai essayé avec la base R ( df1 <- subset (df1, select = -c (Offender))
), mais il renomme ensuite les autres Offenders. #
3 Réponses :
Je l'ai compris en finissant de taper la question:
df1 pour renommer tous les Offenders
, en laissant les autres colonnes intactes.
select_at (vars (-starts_with ("Offender")))
et Bob est votre oncle. En bref:
df1 <- subset(df1, select = -Offender) %>% select_at(vars(-starts_with("Offender")))
Essentiellement, la base R ne se plaindra pas du fait que les colonnes ont le même nom et le réparera silencieusement pour vous. À ce stade, vous pouvez tidyverse
à votre guise.
Pas besoin d'utiliser c (…)
si vous n'avez qu'une seule valeur. Et si vous utilisez select_at
, la commande subset
avant cela est redondante. De plus, le tout peut être simplifié en df1 = select (df1, - starts_with ("Offender"))
select_at
ne fonctionnera pas s'il y a des noms de colonne en double; subset
ne se plaindra pas et n'ajoutera pas de chiffres aux doublons.
Voici une solution de base.
# Create data frame df <- data.frame(runif(10), runif(10), runif(10), runif(10)) names(df) <- c("foo", "bar", "bar", "bar") # Examine data print(df) #> foo bar bar bar #> 1 0.4126322 0.1436917 0.4870304 0.80514914 #> 2 0.1642798 0.7948858 0.7741611 0.64353516 #> 3 0.6485090 0.6607900 0.9260459 0.75226835 #> 4 0.5254531 0.5535233 0.5746025 0.07131740 #> 5 0.1367792 0.4830001 0.4947695 0.46050685 #> 6 0.9517484 0.5750567 0.2231635 0.20050668 #> 7 0.9535626 0.1362335 0.5429668 0.07581875 #> 8 0.6679136 0.5017095 0.3106441 0.02235911 #> 9 0.4489072 0.3811038 0.1922099 0.07851105 #> 10 0.7724686 0.1284880 0.4240226 0.44462081 # Remove all columns called "bar" df[, "bar" == names(df)] <- NULL # Examine data again print(df) #> foo #> 1 0.4126322 #> 2 0.1642798 #> 3 0.6485090 #> 4 0.5254531 #> 5 0.1367792 #> 6 0.9517484 #> 7 0.9535626 #> 8 0.6679136 #> 9 0.4489072 #> 10 0.7724686
Créé le 24/06/2019 par le paquet reprex (v0.3.0)
J'adore - court et doux.
Si vous souhaitez supprimer toutes les colonnes intitulées Offender, je pense qu'il existe un moyen plus simple et plus élégant:
df2 <- df1 %>% dplyr::select(-starts_with("Offender"))
Si ce n'est pas ce que vous voulez, peut-être qu'un exemple minimal pourrait vous aider mieux illustrer ce que vous essayez de faire.
Cela ne fonctionne pas, comme je l'ai mentionné dans la question - vous obtiendrez Erreur: impossible de lier les données car certains arguments ont le même nom.
Oh, maintenant je le vois. Alors la réponse de Lyngbakr est ce dont vous avez besoin. Je ne peux pas faire plus simple que ça. ;)
Pouvez-vous publier des exemples de données? Veuillez modifier la question avec la sortie de
dput (df1)
. Ou, s'il est trop gros avec la sortie dedput (head (df1, 20))
.Je l'ai compris, voir la réponse ci-dessous :)
Peut-être que
make.names (names (df1), unique = TRUE)
.