1
votes

Comment supprimer toutes les colonnes du même nom (tidyverse ou base R)?

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 commentaires

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 de dput (head (df1, 20)) .


Je l'ai compris, voir la réponse ci-dessous :)


Peut-être que make.names (names (df1), unique = TRUE) .


3 Réponses :


1
votes

Je l'ai compris en finissant de taper la question:

  1. Utilisez la commande de base R df1 pour renommer tous les Offenders , en laissant les autres colonnes intactes.
  2. Ensuite, utilisez 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.


2 commentaires

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.



5
votes

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)


1 commentaires

J'adore - court et doux.



0
votes

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.


2 commentaires

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. ;)