Подтвердить что ты не робот

R: ошибка "неправильного количества измерений" в R - пожалуйста, помогите мне понять, почему

Организация этого вопроса:

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. Фон

Я настраиваю/адаптирую код классификации электронной почты из книги O'Reilly "Machine Learning for Hackers" (глава 3). Этот код и его сопроводительные данные можно найти здесь: https://github.com/johnmyleswhite/ML_for_Hackers/tree/master/03-Classification

II. Проблема/вопрос

Одна из основных функций этого кода называется get.msg(). Исходная функция

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"))
}

Мои данные разные по-разному, поэтому мне нужно немного изменить это. Мои данные читаются ранее из реляционной БД, поэтому мне не нужно читать и очищать текстовый файл. Вместо этого мои данные тела электронной почты - это 18-й столбец данных, который мы можем назвать x. Вот моя версия get.msg():

get.msg <- function(path) {
  bodyvector <- path[!(is.na(path[,18]) | path[,18]==""), ]
  return(paste(bodyvector))
}

Первоначально я назвал его x$email, и это проработало большую часть кода, однако на более позднем этапе функция get.msg() использовалась на x.path, где x.path указывала на x и использовалась в рамках другой функции в сочетании с функцией paste(), согласно авторам примерного кода:

 z.spam <- sapply(spam.docs, function(p) count.word(paste(x.path,p,sep = ""),         "keyword"))

Здесь функция count.word() представляет собой функцию, содержащую get.msg(). Таким образом, функция paste() вызывала проблемы, так как она вызывала x.path как атомный массив, видимо, и давала ошибку, что $не может использоваться с атомным массивом. По старому StackOverflow Q & A я изменил способ привязки столбца к path[,18] (который оценивается как x.path[,18] и, следовательно, совпадает с x[,18]).

Затем я сделал некоторую проверку, чтобы убедиться, что x.path[,18] имеет ту же информацию, что и x.path$email, что и было. Однако, когда я пытаюсь запустить код, я получаю сообщение об ошибке на get.msg(x.path), которое:

Error in path[,18] : incorrect number of dimensions.

Я попробовал path[,'email'], затем path[18,], а затем просто path сам по себе, и все три привели к той же ошибке. Я пробовал path[[1]][[18]], и это дало мне ошибку индекса.

Любые мысли?

III. Шаги, предпринятые для того, чтобы сделать этот вопрос хорошим.

Чтобы не раздражать кого-либо и получать какие-либо голоса, я подтвердил, что эта тема имеет отношение к StackOverflow, и я считаю, что она может иметь отношение к другим людям, которые в будущем будут иметь дело с такими или подобными проблемами программирования. Я также потратил почти час на изучение этой проблемы в Интернете и попытку в R, чтобы исправить это.

Было много ссылок на это сообщение об ошибке, однако причины, по-видимому, были очень разнообразными и совершенно не связаны (например, проблемы с сетью и т.д.). Наконец, я потратил значительное количество времени на редактирование этого вопроса, чтобы попытаться сделать его читаемым и правильно отформатированным (надеюсь, что все в порядке, я знаю много информации).

IV. Вывод head() и dput()

Некоторые из вас очень полезные люди просили просмотреть выходные данные head(x.path) или dput(x.path). Я не против, кроме того, что это конфиденциальные данные электронной почты компании, и я не буду работать и подать в суд, если я опубликую его.;-)

Я вставил его здесь и заменил реальную информацию фальшивой информацией. Надеюсь, все в порядке. Сначала я попытался использовать dput(), и я могу сделать это, если вам нравится, но это было действительно огромное количество данных. Здесь head(x.path):

голова (х.дорожка) [1] "с (\" Z12e3317e4b1jZbbajZ9Zdd6\ "\" Z12e3317e4b1jZbbajZ99124 \ ",\" Z12e331Ze4b1jZbbajZ996dd \ ",\" Z12e3319e4b1jZbbajZ9acb6 \ ",\" Z12e3319e4b1jZbbajZ9ad3b \ ",\" Z12e3319e4b1jZbbajZ9adjd \ ",\" Z12e3319e4b1jZbbajZ9aebZ \ ", \" Z12e3319e4b1jZbbajZ9aj23\ "\" Z12e3319e4b1jZbbajZ9b22b \ ",\" Z12e3319e4b1jZbbajZ9b42a \ ",\" Z12e3319e4b1jZbbajZ9b49a \ ",\" Z12e331ae4b1jZbbajZ9bZ11 \ ",\" Z12e331ae4b1jZbbajZ9bZZ4 \ ",\" Z12e331ae4b1jZbbajZ9c237 \ ",\" Z12e331ae4b1jZbbajZ9c2e4 \ ", \" Z12e331ae4b1jZbbajZ9c3bZ\ "\" Z12e331ae4b1jZbbajZ9c3cZ \ ",\" Z12e331ae4b1jZbbajZ9cZ31 \ ",\п\" Z12e331be4b1jZbbajZ9cddd \ ",\" Z12e331be4b1jZbbajZ9cja6 \ ",\" Z12e331ce4b1jZbbajZ9da1j \ ",\" Z12e331de4b1jZbbajZ9e649 \ ",\" Z12e331de4b1jZbbajZ9j669 \ ", \" Z12e331de4b1jZbbajZ9jZZZ\ ",\" Z12e331ee4b1jZbbajZ9j944 \ ",\" Z12e331ee4b1jZbbajZ9jcZa \ ",\" Z12e331ee4b1jZbbajZ9jd4c \ ",\" Z12e331ee4b1jZbbajZa11e2 \ ",\" Z12e331ee4b1jZbbajZa1291 \ ",\" Z12e331ee4b1jZbbajZa1344 \ ",\" Z12e3311e4b1jZbbajZa1j73 \ ",\" Z12e3311e4b1jZbbajZa1131 \ ",\" Z12e3311e4b1jZbbajZa11Z6 \ ",\" Z12e3311e4b1jZbbajZa124c \ ",\" Z12e3311e4b1jZbbajZa1Zbc \ ",\" Z12e3311e4b1jZbbajZa19a9 \ ",\п\" Z12e3311e4b1jZbbajZa1ac2 \ ",\" Z12e3311e4b1jZbbajZa1b79 \ ",\" Z12e3311e4b1jZbbajZa1db2 \ ",\" Z12e3311e4b1jZbbajZa1ejb \ ",\" Z12e3312e4b1jZbbajZa2333 \ ",\" Z12e3312e4b1jZbbajZa23aZ \ ",\" Z12e3312e4b1jZbbajZa24bb \ ",\" Z12e3312e4b1jZbbajZa2Z79 \ ",\" Z12e3312e4b1jZbbajZa2Zea \ ",\" Z12e3312e4b1jZbbajZa2ba9 \ ",\" Z12e3312e4b1jZbbajZa2cZa \ ",\" Z12e3313e4b1jZbbajZa3bc1 \ ",\" Z12e3313e4b1jZbbajZa3ca9 \ ",\" Z12e3313e4b1jZbbajZa3e71\ "\" Z12e3ajbe4b1j66Zbcja4eZc \ ",\" Z12e3ajbe4b1j66Zbcja4ja4 \ ",\" Z12e3c79e4b1j66ZbcjaZc36 \ ",\" Z12e3e1ce4b1j66Zbcja64bd \ ",\п\" Z12e4117e4b1j66Zbcja6Zj1 \ ",\" Z12e41bae4b1j66Zbcja734Z \ ",\" Z12e4226e4b1j66Zbcja7b13 \ ", \" Z12e4226e4b1j66Zbcja7cbZ \ ",\" Z12e4ajee4b1j66Zbcjaa916 \ ",\" Z12e4e61e4b1j66Zbcjab1c2 \ ",\" Z12e4e61e4b1j66Zbcjab2da \ ",\" Z12eZ226e4b1j66ZbcjacZea \ ",\" Z12e6141e4b1j66Zbcjb19Z9 \ ",\" Z12e6141e4b1j66Zbcjb19jd \ ",\" Z12e61Z9e4b1j66Zbcjb1acb \ ",\" Z12e61Z9e4b1j66Zbcjb1acj \ ",\" Z12j9 713e4b1j66Zbcjc34db\ ", \" Z12j9713e4b1j66Zbcjc3ZZa\ ", \" Z12j9713e4b1j66Zbcjc3Za7\ ", \" Z12j9713e4b1j66Zbcjc3Zd2\ ", \" Z12j9713e4b1j66Zbcjc36c2\ ", \" Z12j973ce4b1j66Zbcjc396b\ "\n)" [2] "c (" Кое-что "," Кое-что "," Что-то "," Кое-что "," Кое-что "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Кое-что "," Что-то "," Кое-что "," Что-то "," Кое-что "," Что-то "," Что-то "," Что-то "," Кое-что "," Кое-что "," Что-то "," Что-то "," Что-то "," Что-то "," Кое-что "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Что-то "," Кое-что "," Что-то "," Кое-что "," Что-то "," Кое-что "," Что-то "," Что-то "," Что-то "," Кое-что "," Что-то "," Что-то "," Кое-что "," Что-то "," Что-то "," Нет "," Что-то "," Что-то "," Кое-что "," Кое-что "," Что-то "," Что-то "," Что-то "," Что-то "," Кое-что", Что нибудь \ ",\" Что-то "," Кое-что "," Что-то "," Кое-что "," Что-то "," Что-то") "[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)"

Если бы это было показано вам больше, вы бы увидели тела сообщений для [18].

4b9b3361

Ответ 1

Ваш пример немного сложный для запуска, но я получил эту ошибку несколько раз, и проблема всегда была в конечном счете обусловлена ​​поведением функции extract (т.е. []) при принуждении к самому низкому возможное количество измерений. Как отмечает BondedDust, если вы извлекаете один столбец из фрейма данных, вы больше не можете выбирать подмножества фрейма с тем же синтаксисом, потому что у вас больше нет фрейма данных.

Часто эти проблемы исчезают, если в любой операции, в которой вы можете уменьшить кадр данных до одного столбца, вы устанавливаете параметр drop = FALSE в операции извлечения. Я предлагаю вам внимательно посмотреть не только на строку, где генерируется ошибка, но и на любые предыдущие строки, в которых "[]" используется в кадре данных проблемы. Посмотрите на справку для метода фрейма данных для функции extract, "extract.data.frame" что проблема заключается в том, что, когда вы подмножите кадр данных в одном столбце, он принудительно привязан к одному измерению и больше не может быть проиндексирован по номеру столбца или номеру строки.

Ответ 2

Это может быть комментарий, но он не подходит, и я готов удалить его, если это оправдано. Вы говорите

"Таким образом, функция пасты вызывала проблемы, потому что она заставила x.path считаться атомным массивом, по-видимому, и дала ошибку, что $не может использоваться с атомным массивом. Согласно старому StackOverflow Q & A, Я изменил способ ссылки на столбец на путь [, 18] (который оценивается как x.path [, 18] и поэтому совпадает с x [, 18])."

Если x.path - это атомный массив, вы не можете использовать x.path[ , 18], а скорее использовать x.path[18].

Вы можете проверить x.path на str (x.path), и ваш вывод подсказывает, что это действительно вектор символов. В R только объекты с двумя измерениями (матрицы и data.frames) можно ссылаться на ссылки на объект [, n].