8
votes

En utilisant R, obtenir un "Impossible de lier les données car certains arguments ont le même nom" en utilisant dplyr: sélectionnez

dput

> dput(head(x.test[,1:5],2))
structure(list(V1 = c(0.25717778, 0.28602671), V2 = c(-0.02328523, 
-0.013163359), V3 = c(-0.014653762, -0.11908252), V4 = c(-0.938404, 
-0.97541469), V5 = c(-0.92009078, -0.9674579)), row.names = 1:2, class = "data.frame")

> dput(head(subject.test,2))
structure(list(V1 = c(2L, 2L)), row.names = 1:2, class = "data.frame")

> dput(head(y.test,2))
structure(list(V1 = c(5L, 5L)), row.names = 1:2, class = "data.frame")

> dput(head(features,2))
structure(list(V1 = 1:2, V2 = c("tBodyAcc-mean()-X", "tBodyAcc-mean()-Y"
)), row.names = 1:2, class = "data.frame")

9 commentaires

Vous devez modifier pour ajouter des exemples de données pour la reproductibilité. Utilisez dput pour fournir des exemples de données. Plus de détails ici


Que renvoie names (dataset_test) ?


Il renvoie: [1] "subject" "tBodyAcc-mean () - X" "tBodyAcc-mean () - Y" "tBodyAcc-mean () - Z" [1] "subject" "tBodyAcc-mean () - X "" tBodyAcc-mean () - Y "" tBodyAcc-mean () - Z "[5]" tBodyAcc-std () - X "" tBodyAcc-std () - Y "" tBodyAcc-std () - Z "" tBodyAcc-mad () - X "[9]" tBodyAcc-mad () - Y ".....


C'est ce que j'attendais qu'il revienne


Pouvez-vous partager un échantillon des données en utilisant dput


Bien sûr, alors dput chaque variable?


posté comme demandé :)


J'ai vu la même erreur (avec un autre ensemble de données), après la mise à jour de R récemment. Les données restent inchangées.


J'ai résolu le problème mais je ne me souviens pas exactement du problème. Si je me souviens bien, d'une manière ou d'une autre, la liaison et la fusion précédentes ont conduit à des noms de colonnes en double. Vérifiez s'il existe des noms de colonne en double.


4 Réponses :


1
votes

Cette erreur est souvent causée par un bloc de données ayant des colonnes avec noms identiques , ce devrait être la première chose à vérifier. J'essayais de vérifier ma propre trame de données avec les fonctions d'aide de sélection de dplyr (start_with, contains, etc.), mais même celles-ci ne fonctionneront pas, vous devrez peut-être exporter vers un csv pour vérifier dans Excel ou un autre programme ou utiliser fonctions de base pour vérifier les noms de colonnes en double .


1 commentaires

Les liens vers des ressources externes sont encouragés, mais veuillez ajouter du contexte autour du lien afin que vos collègues utilisateurs aient une idée de ce que c'est et pourquoi il est là. Citez toujours la partie la plus pertinente d'un lien important, au cas où le site cible serait inaccessible ou serait définitivement hors ligne.



17
votes

J'ai eu exactement le même problème et je pense que je regarde le même jeu de données que vous. Ce sont les données du capteur de mouvement d'un téléphone intelligent, n'est-ce pas?

Le problème est exactement ce que dit le message d'erreur! Cet ensemble de dang a des noms de colonne en double. Voici comment je l'ai exploré. Je n'ai pas pu utiliser vos commandes dput , je n'ai donc pas pu tester vos données. Je montre mon code et mes résultats. Je vous suggère de remplacer votre variable, dataset_test , là où j'ai samsungData.

Voici l'erreur. Si vous sélectionnez simplement l'ensemble de données, mais n'indiquez pas les colonnes, le message d'erreur identifie les doublons.

                                Var1 Freq
9        fBodyAcc-bandsEnergy()-1,16    3
10       fBodyAcc-bandsEnergy()-1,24    3
11        fBodyAcc-bandsEnergy()-1,8    3

Cela m'a donné cette erreur, qui est exactement ce que votre propre déplyr erreur essayait de vous le dire.

Erreur: Colonnes "fBodyAcc-bandsEnergy () - 1,8", "fBodyAcc-bandsEnergy () - 9,16", "fBodyAcc-bandsEnergy () - 17, 24 "," fBodyAcc-bandsEnergy () - 25,32 "," fBodyAcc-bandsEnergy () - 33,40 ", ... doit avoir un nom unique

Ensuite, je voulais voir où cela en premier la colonne a été dupliquée. (Je ne pense pas que je travaillerai jamais bien avec les expressions régulières, mais celle-ci m'a rendu fou et je voulais la trouver.)

names_freq <- as.data.frame(table(names(samsungData)))
names_freq[names_freq$Freq > 1, ]

Résultats: p >

[1] "fBodyAcc-bandsEnergy()-1,8" "fBodyAcc-bandsEnergy()-1,8" "fBodyAcc-bandsEnergy()-1,8"

Cela m'a montré que le même nom de colonne apparaît à trois positions. Cela ne fonctionnera pas très bien dans dplyr.

Ensuite, je voulais voir un tableau de fréquences pour tous les noms de colonnes et appeler les doublons.

has_dupe_col <- grep("fBodyAcc\\-bandsEnergy\\(\\)\\-1,8", names(samsungData))
names(samsungData)[has_dupe_col]

Un tas d'entre eux apparaît trois fois! En voici quelques-uns.

select(samsungData)

Conclusion:

L'outil (dplyr) n'est pas cassé, les données sont défectueuses. Si vous souhaitez utiliser dplyr pour sélectionner dans cet ensemble de données, vous devrez localiser ces noms de colonnes en double et faire quelque chose à leur sujet. Peut-être que vous changez le nom de la colonne ( mutate de dplyr le fera pour vous sans problème). D'un autre côté, ils sont peut-être censés être dupliqués et ils sont là parce qu'il s'agit d'une série chronologique ou d'une itération d'observations expérimentales. Peut-être que vous devez alors fusionner ces colonnes en une seule et fournir une autre dimension (variable) pour les distinguer.

C'est la partie analyse de l'analyse des données. Vous devrez fouiller dans les données pour voir quelle est la bonne réponse. Soit cela, soit la question à laquelle vous essayez de répondre n'a même pas besoin d'inclure ces colonnes en double, auquel cas vous les jetez et dormez paisiblement.

Bienvenue dans la science des données! Au mieux, il ne s'agit que de 10% de mathématiques et d'apprentissage automatique. 90% mettent des gants et un masque et essuient la merde comme celle-ci dans vos données.


0 commentaires

7
votes

J'ai récemment rencontré le même problème avec un ensemble de données différent. Ma solution tidyverse pour identifier les noms de colonnes en double dans le dataframe (df) était:

tibble :: enframe (names (df))%>% count (value)%>% filter (n> 1)


0 commentaires

0
votes

Une autre possibilité de trouver des noms de colonnes en double en utilisant Base R serait d'utiliser dupliqué:

colnames(df)[which(duplicated(colnames(df)))]


0 commentaires