“Incorrect le nombre de dimensions d'erreur”, m'aider à comprendre pourquoi
Organisation de cette question:
I. Background
II. The Problem/Question
III. Steps Taken to Make this Question Good
IV. Update: the output of head(x.path) and dput(x.path)
I. Contexte
Je suis la personnalisation ou l'adaptation de l'e-mail le code de classification à partir d'O'Reilly livre "l'Apprentissage de la Machine pour les Pirates" (Chapitre 3). Le code et ses données associées peuvent être trouvés ici: https://github.com/johnmyleswhite/ML_for_Hackers/tree/master/03-Classification
II. Le Problème/Question
L'une des principales fonctions de ce code est appelé get.msg()
. La fonction d'origine est
get.msg <- function(path)
{
con <- file(path, open = "rt", encoding = "latin1")
text <- readLines(con)
# The message always begins after the first full line break
msg <- text[seq(which(text == "")[1] + 1, length(text), 1)]
close(con)
return(paste(msg, collapse = "\n"))
}
Mes données sont différentes dans un certain nombre de façons, donc j'ai modifier un peu les choses. Mes données sont lues à partir plus tôt un relationnel, donc je n'ai pas à lire et nettoyer un fichier texte. Au lieu de cela, mon corps du message de données est la 18e colonne d'un dataframe, que nous pouvons appeler x
. Voici ma version de get.msg()
:
get.msg <- function(path) {
bodyvector <- path[!(is.na(path[,18]) | path[,18]==""), ]
return(paste(bodyvector))
}
À l'origine, je me réfère à elle comme x$email
et cela a fonctionné à travers la plupart du code, mais dans une étape ultérieure de la get.msg()
fonction a été utilisée sur x.path
, où x.path
souligné x
et a été utilisé dans une autre fonction en combinaison avec la paste()
fonction, selon les auteurs de l'exemple de code:
z.spam <- sapply(spam.docs, function(p) count.word(paste(x.path,p,sep = ""), "keyword"))
Ici, le count.word()
fonction est une fonction contenant get.msg()
. Ainsi, la paste()
fonction a été à l'origine des problèmes parce qu'il a causé x.path
être considéré comme un atomique tableau apparemment, et a donné l'erreur que $ ne peut pas être utilisé avec un atomic tableau. Selon une ancienne StackOverflow Q&A, j'ai changé ma façon visée à la colonne de path[,18]
(qui est évalué comme x.path[,18]
et, par conséquent, est la même que x[,18]
).
Puis j'ai fait quelques vérifications pour s'assurer que x.path[,18]
avait les mêmes informations que x.path$email
, ce qu'elle fit. Cependant, lorsque j'essaie d'exécuter le code que j'obtiens un message d'erreur sur get.msg(x.path)
, qui est:
Error in path[,18] : incorrect number of dimensions.
J'ai essayé path[,'email']
, puis path[18,]
et puis juste path
par lui-même et tous les trois ont conduit à la même erreur. J'ai essayé path[[1]][[18]]
et qui m'a donné un indice en dehors des limites d'erreur.
Toutes les pensées?
III. Les mesures Prises pour Faire de cette Question une Bonne
Pour éviter d'agacer quelqu'un et d'obtenir des votes, j'ai confirmé que le sujet est pertinent pour StackOverflow et je pense qu'il peut être utile à d'autres personnes s'occupant de ce ou de la programmation semblable à des problèmes dans le futur. J'ai aussi passé près d'une heure à la recherche de ce problème en ligne et d'essayer des choses dans R pour réparer.
Il y avait beaucoup de références à ce message d'erreur, cependant, la cause semblait être très diverses et complètement indépendants (tels que la mise en réseau de la difficulté, etc). Enfin, j'ai passé une quantité importante de temps sur le montage de cette question pour essayer de le rendre lisible et correctement mis en forme (j'espère que j'ai fait d'accord, je sais que c'est beaucoup d'informations).
IV. La sortie de head()
et dput()
Certains d'entre vous très utile, les gens ont demandé à voir la sortie de head(x.path)
ou dput(x.path)
. Je ne me dérange pas sauf que c'est une société confidentielle les données de messagerie et je vais être hors d'un travail et poursuivi en justice si je la publie. 😉
Je l'ai collé ici et a remplacé la vraie info avec des fausses infos. J'espère que c'est ok. J'ai essayé d'utiliser dput()
au premier abord et je peux le faire si vous le souhaitez, mais c'était vraiment une quantité énorme de données. Voici head(x.path)
:
> head(x.path)
[1] "c(\"Z12e3317e4b1jZbbajZ9Zdd6\", \"Z12e3317e4b1jZbbajZ99124\", \"Z12e331Ze4b1jZbbajZ996dd\", \"Z12e3319e4b1jZbbajZ9acb6\", \"Z12e3319e4b1jZbbajZ9ad3b\", \"Z12e3319e4b1jZbbajZ9adjd\", \"Z12e3319e4b1jZbbajZ9aebZ\", \"Z12e3319e4b1jZbbajZ9aj23\", \"Z12e3319e4b1jZbbajZ9b22b\", \"Z12e3319e4b1jZbbajZ9b42a\", \"Z12e3319e4b1jZbbajZ9b49a\", \"Z12e331ae4b1jZbbajZ9bZ11\", \"Z12e331ae4b1jZbbajZ9bZZ4\", \"Z12e331ae4b1jZbbajZ9c237\", \"Z12e331ae4b1jZbbajZ9c2e4\", \"Z12e331ae4b1jZbbajZ9c3bZ\", \"Z12e331ae4b1jZbbajZ9c3cZ\", \"Z12e331ae4b1jZbbajZ9cZ31\", \n\"Z12e331be4b1jZbbajZ9cddd\", \"Z12e331be4b1jZbbajZ9cja6\", \"Z12e331ce4b1jZbbajZ9da1j\", \"Z12e331de4b1jZbbajZ9e649\", \"Z12e331de4b1jZbbajZ9j669\", \"Z12e331de4b1jZbbajZ9jZZZ\", \"Z12e331ee4b1jZbbajZ9j944\", \"Z12e331ee4b1jZbbajZ9jcZa\", \"Z12e331ee4b1jZbbajZ9jd4c\", \"Z12e331ee4b1jZbbajZa11e2\", \"Z12e331ee4b1jZbbajZa1291\", \"Z12e331ee4b1jZbbajZa1344\", \"Z12e3311e4b1jZbbajZa1j73\", \"Z12e3311e4b1jZbbajZa1131\", \"Z12e3311e4b1jZbbajZa11Z6\", \"Z12e3311e4b1jZbbajZa124c\", \"Z12e3311e4b1jZbbajZa1Zbc\", \"Z12e3311e4b1jZbbajZa19a9\", \n\"Z12e3311e4b1jZbbajZa1ac2\", \"Z12e3311e4b1jZbbajZa1b79\", \"Z12e3311e4b1jZbbajZa1db2\", \"Z12e3311e4b1jZbbajZa1ejb\", \"Z12e3312e4b1jZbbajZa2333\", \"Z12e3312e4b1jZbbajZa23aZ\", \"Z12e3312e4b1jZbbajZa24bb\", \"Z12e3312e4b1jZbbajZa2Z79\", \"Z12e3312e4b1jZbbajZa2Zea\", \"Z12e3312e4b1jZbbajZa2ba9\", \"Z12e3312e4b1jZbbajZa2cZa\", \"Z12e3313e4b1jZbbajZa3bc1\", \"Z12e3313e4b1jZbbajZa3ca9\", \"Z12e3313e4b1jZbbajZa3e71\", \"Z12e3ajbe4b1j66Zbcja4eZc\", \"Z12e3ajbe4b1j66Zbcja4ja4\", \"Z12e3c79e4b1j66ZbcjaZc36\", \"Z12e3e1ce4b1j66Zbcja64bd\", \n\"Z12e4117e4b1j66Zbcja6Zj1\", \"Z12e41bae4b1j66Zbcja734Z\", \"Z12e4226e4b1j66Zbcja7b13\", \"Z12e4226e4b1j66Zbcja7cbZ\", \"Z12e4ajee4b1j66Zbcjaa916\", \"Z12e4e61e4b1j66Zbcjab1c2\", \"Z12e4e61e4b1j66Zbcjab2da\", \"Z12eZ226e4b1j66ZbcjacZea\", \"Z12e6141e4b1j66Zbcjb19Z9\", \"Z12e6141e4b1j66Zbcjb19jd\", \"Z12e61Z9e4b1j66Zbcjb1acb\", \"Z12e61Z9e4b1j66Zbcjb1acj\", \"Z12j9713e4b1j66Zbcjc34db\", \"Z12j9713e4b1j66Zbcjc3ZZa\", \"Z12j9713e4b1j66Zbcjc3Za7\", \"Z12j9713e4b1j66Zbcjc3Zd2\", \"Z12j9713e4b1j66Zbcjc36c2\", \"Z12j973ce4b1j66Zbcjc396b\"\n)"
[2] "c(\"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \n\"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\", \"Something\")"
[3] "c(61Z7, 674Z, Z462, 692, Z26, 1121, 1213, 1317, 21ZZ, 2Z9Z, 2711, 3612, 3717, 4774, 4Z93, Z117, Z113, Z197, Z77Z, 61Z3, Z16Z, 11771, 12923, 13374, 13Z93, 14277, 1446Z, 1Z3ZZ, 1ZZ16, 1Z993, 164Z2, 16664, 1711Z, 171Z6, 1Z6ZZ, 1Z921, 19211, 193ZZ, 19931, 21117, 21164, 21177, 21371, 21Z61, 21673, 22ZZ7, 23137, 2ZZ44, 26166, 26Z1Z, 173Z6, 17661, 21Z74, 23119, 232ZZ, 249Z3, 2ZZ31, 261Z9, 31211, 33414, 336Z6, 37941, 1743, 1Z61, 216Z, 2171, 1ZZ3, 2119, 21Z4, 2129, 2334, 2ZZZ)"
[4] "c(\"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \n\"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\", \"Booty\")"
[5] "c(Z6, 93Z, 1314, 3, 4, Z, 6, 7, 9, 11, 11, 13, 14, 2Z, 26, 27, 2Z, 29, 33, 34, ZZ, Z3, 122, 12Z, 133, 139, 142, 147, 1Z2, 1Z3, 16Z, 169, 171, 171, 219, 221, 221, 222, 22Z, 226, 244, 246, 247, 24Z, 249, 2637, 264, 2Z9, 292, 296, 49, Z1, 76, 93, 9Z, 112, 111, 114, 1Z7, 211, 214, 263, 6, 7, 11, 11, 11, 11, 12, 13, 14, 1Z)"
[6] "c(3Z11, 3Z11, 3Z11, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, 691Z, Z664, Z664, Z664, Z664, Z664, Z664, Z664, Z664, Z664, Z664, Z664, Z664, 66Z1, 66Z1, 66Z1, 66Z1, 4ZZ4, 4ZZ4, 4ZZ4, 4ZZ4, 4ZZ4, 4ZZ4)"
Si c'était pour vous montrer plus alors que vous auriez du voir le corps du message pour [18].
La pensée est
path
doit être un deux-dimension de l'objet (par exemple, data.frame
ou matrix
), de sorte que vous pouvez faire path[,18]
; votre x.path
ne l'est pas. Il suffit de ne class(x.path)
et vous devriez voir ça.Mise à jour: j'ai aussi essayé de remplacer [,18] avec [,'email'] mais j'ai reçu le même message. Je vois deux commentaires surgi alors que je suis en train de modifier ce alors laissez-moi à sauver mon confie alors je vais suivre le vôtre (et merci btw!). Je voudrais vous donner la sortie de la tête() mais c'est confidentiel des corps de message : /
flodel: Vous avez raison, la classe de(x.chemin d'accès) montre qu'il est de caractère du fait de la pâte() de commande, mais je n'ai utilisé qu'en raison de la auteurs de l'exemple et parce que je ne peux pas comprendre comment obtenir loin de tout en utilisant la fonction anonyme comme dans ce troisième extrait de code dans mon premier post. Est-il une manière que je pourrais le faire sans coller tho? Désolé pour la question stupide.
Romain: j'ai peut cependant décrire la sortie de la tête(x.chemin d'accès). C'est un grand dataframe avec différents types de données stockées relatives à un client de messagerie. La seule colonne je me soucie pour le moment est le corps de l'email de la colonne et que l'on est juste le texte des e-mails, avec \r et \n et d'autres représentations du texte de mise en forme.
OriginalL'auteur user2225772 | 2013-03-29
Vous devez vous connecter pour publier un commentaire.
Votre exemple est un peu complexe pour moi de courir, mais j'ai obtenu cette erreur un certain nombre de fois et le problème a toujours été en raison en fin de compte le comportement par défaut de l'extrait de fonction (c'est à dire []) dans le fait de contraindre le plus possible le nombre de dimensions. Comme BondedDust observe, si vous extrayez une seule colonne à partir d'un bloc de données, vous ne pouvez plus sélectionner des sous-ensembles de l'image avec la même syntaxe, parce que vous ne disposez pas d'un bloc de données.
Souvent, ces problèmes disparaissent si, lors d'une opération dans laquelle vous pouvez peut-être réduire le bloc de données à une seule colonne, vous définissez le paramètre drop=FALSE dans l'extrait de l'opération. Je suggère que vous regardez attentivement, non seulement à la ligne où l'erreur est généré mais également à toutes les lignes précédentes, dans lequel les "[]" l'opération est utilisé sur le problème de la trame de données. Rechercher à l'aide de la trame de données pour la méthode de l'extrait de fonction "extraire.les données.cadre"
croire que le problème est probablement que lorsque vous sous-ensemble de la trame de données en une seule colonne, il est contraint à une seule dimension et ne peut plus être indexé par le numéro de colonne ou de numéro de ligne.
OriginalL'auteur andrewH
Cela mérite peut-être un commentaire, mais il ne rentrait pas et je suis prêt à supprimer si nécessaire. Vous dites
"Donc, la fonction coller a été à l'origine des problèmes parce qu'il a causé x.chemin pour être considérée comme une atomique tableau apparemment, et a donné l'erreur que $ ne peut pas être utilisé avec un atomic tableau. Selon une ancienne StackOverflow Q&A, j'ai changé la façon dont je l'ai mentionné à la colonne chemin d'accès[,18] (qui est évalué comme x.chemin[,18] et, par conséquent, est le même que x[,18])."
Si x.chemin d'accès est atomique tableau alors vous ne pouvez pas utiliser
x.path[ , 18]
mais plutôt besoin d'utiliserx.path[18]
.Vous pouvez inspecter x.chemin avec str(x.chemin d'accès) et de la production de votre suggère c'est en effet un caractère de vecteur. En R seuls les objets à deux dimensions (matrices et des données.les images) peuvent être référencés par l'objet[ , n] références.
Par ailleurs, il est de caractère (grâce à coller) et str(x.chemin d'accès) me donne ceci: str(x.chemin d'accès) chr [1:145] "c(\"5... et puis il va sur un long chemin
dim(x.chemin) dit NULLE... donc il n'a pas de dimensions, mais je ne suis même pas vraiment sûr de ce que cela signifie. Si il n'y a pas les dimensions ne devrait pas le chemin par lui-même avez travaillé? Mais qui a donné la même erreur...
Vecteurs dans R ont pas de dimensions. Il a juste un caractère ordinaire vecteur. Je ne sais pas ce que tu veux dire par "ne devrait pas le chemin du travail".
Merci. Il semble que nous sommes sur la même page; c'est ce que je pensais. Quand j'ai dit "ne devrait pas le chemin du travail" que je voulais dire, car il y a une seule colonne/vecteur devrait simplement à l'aide de "chemin" par lui-même plutôt que de chemin[,18] en obtenir.msg le faire fonctionner? Mais ça donne la même erreur. J'ai également essayé de changer la pâte déclaration de spécifier la colonne d'intérêt à ce point, mais il ne fonctionne pas.
OriginalL'auteur 42-