R:" nombre Incorrect de dimensions " erreur dans R - Aidez-moi à 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.

je personnalise/adapte le code de classification e-mail du livre D'O'Reilly "Machine Learning for Hackers" (Chapitre 3). Ce code et les données qui l'accompagnent se trouvent ici: https://github.com/johnmyleswhite/ML_for_Hackers/tree/master/03-Classification

II. Les Problème / Question

l'Une des principales fonctions de ce code est appelé get.msg(). La fonction originale 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, mes données de corps d'e-mail est la 18ème colonne d'une 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 l'appelais x$email et cela a fonctionné à travers la plupart du code, cependant dans une étape ultérieure le 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 count.word() la fonction est une fonction contenant get.msg(). Ainsi, le paste() la fonction causait des problèmes parce qu'elle causé x.path pour être considéré comme un tableau atomique apparemment, et a donné l'erreur que $ ne pouvait pas être utilisé avec un tableau atomique. Comme pour une ancienne Q&R de StackOverflow, j'ai changé la façon dont j'ai fait référence à la colonne à path[,18] (qui est évalué comme x.path[,18] et, par conséquent, est le même que x[,18]).

alors j'ai fait quelques vérifications pour m'assurer que x.path[,18] avait la même information que x.path$email, qui fut le cas. 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 path par elle-même et les trois ont conduit à la même erreur. J'ai essayé path[[1]][[18]] et cela m'a donné un indice d'erreur hors limite.

des idées?

III. Mesures prises pour que cette Question soit 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 les personnes atteintes d'une semblable problèmes de programmation dans l'avenir. J'ai aussi passé près d'une heure à chercher ce problème en ligne et à essayer des choses en R pour le résoudre.

il y avait beaucoup de références à ce message d'erreur, cependant les causes semblaient être très diverses et complètement sans rapport (comme des problèmes de réseau, etc). Enfin, j'ai passé beaucoup de temps à éditer cette question pour essayer de la rendre lisible et correctement formatée (j'espère que j'ai bien fait, je sais que c'est un beaucoup d'informations).

IV. La sortie de head() et dput()

certains d'entre vous ont demandé à voir la sortie de head(x.path) ou dput(x.path). Ça ne me dérange pas sauf que ce sont des données confidentielles de la compagnie et je serai viré et poursuivi en justice si je les publie. ; -)

Je l'ai collé ici et j'ai remplacé la vraie info par une fausse info. J'espère que c'est ok. J'ai essayé d'utiliser dput() au début et je peux le faire si vous voulez mais c'était vraiment une quantité énorme de données. Ici head(x.path):

tête (x.chemin) [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", "Z12e331ee4b1jbbajz9jd4c", "z12e331ee4b1jzbbajza11e2", "Z12e331ee4b1jZbbajZa1291", "Z12e331ee4b1jZbbajZa1344", "Z12e3311e4b1jZbbajZa1j73", "Z12e3311e4b1jZbbajZa1131", "Z12e3311e4b1jZbbajZa11Z6", "z12e3311e4b1jzbbajza124c", "z12e3311e4b1jzbbajza1zbc", "Z12e3311e4b1jzbbajza19a9", n"Z12e3311e4b1jzbbajza1ac2", "Z12e3311e4b1jzbbajza1b79", "z12e3311e4b1jzbbajza1db2", "Z12e3311e4b1jzbbajza1ejb", "Z12e3312e4b1jzbbajza2333", "Z12e3312e4b1jzbbajza23az", "Z12e3312e4b1jbbajza24b", "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("quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", "quelque Chose", n"quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose", "Quelque Chose")"

[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 cela devait vous montrer plus, alors vous verriez le message corps pour [18].

12
demandé sur ROMANIA_engineer 2013-03-30 03:52:52

2 réponses

votre exemple est un peu complexe à exécuter pour moi, mais j'ai eu cette erreur un certain nombre de fois et le problème a toujours été dû en fin de compte au comportement par défaut de la fonction extract (i.e. []) en faisant pression sur le plus petit nombre possible de dimensions. Comme BondedDust l'observe, si vous extrayez une seule colonne d'une base de données, vous ne pouvez plus sélectionner des sous-ensembles de la base avec la même syntaxe, parce que vous n'avez plus de base de données.

Souvent ces problèmes disparaissez si, dans n'importe quelle opération dans laquelle vous pouvez réduire le cadre de données à une seule colonne, vous définissez le paramètre drop=FALSE dans l'opération d'extraction. Je suggère que vous examiniez attentivement non seulement la ligne où l'erreur est générée, mais aussi toutes les lignes précédentes dans lesquelles l'opération "[]" est utilisée sur la base de données du problème. Regardez l'aide pour la méthode de base de données pour la fonction d'extraction, " Extraire.données.cadre" croire que le problème est probablement que lorsque vous sous-ensemble du bloc de données à un colonne simple, elle est forcée à une seule dimension et ne peut plus être indexée par numéro de colonne ou de ligne.

5
répondu andrewH 2014-04-16 06:52:14

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. Comme pour une ancienne question et réponse sur le débordement des piles, j'ai changé la façon dont j'ai fait référence à la colonne en chemin[,18] (qui est évalué comme X. le chemin[,18] est donc le même que x[,18])."

si x.le chemin est un tableau atomique alors vous ne pouvez pas utiliser x.path[ , 18] mais plutôt besoin d'utiliser x.path[18].

vous pouvez inspecter X. chemin avec str(x.path) et votre sortie suggère qu'il s'agit bien d'un vecteur de caractères. En R, seuls les objets à deux dimensions (matrices et données).frames) peut être référencé avec l'objet[ , n] références.

1
répondu 42- 2013-03-30 01:55:54