Ошибка записи в CSV - PullRequest
       8

Ошибка записи в CSV

7 голосов
/ 29 ноября 2011

Я пытаюсь записать фрейм данных в csv, но, похоже, он жалуется, поскольку столбцы содержат списки.

Я хочу иметь возможность получить доступ к этому фрейму данных и вызвать его в Rпозже.Мне все равно, как это сделать (сохранить в виде текстового файла и т. Д.).Это довольно большой набор данных n = 182305.Любые идеи записать его в файл, который я могу довольно быстро прочитать в R (я не женат на CSV-файле)

Рамка данных и код, который я пробовал

DF2<-structure(list(word = c("3-D", "4-F", "4-H'er", "4-H", "A battery", 
"a bon march"), pos.code = c("AN", "N", "N", "A", "h", "v"), 
    pos = list(c("A", "N"), "N", "N", "A", "h", "v"), noun = list(
        TRUE, TRUE, TRUE, FALSE, FALSE, FALSE), plural = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), noun.phrase = list(
        FALSE, FALSE, FALSE, FALSE, TRUE, FALSE), verb.usually.participle = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), transitive.verb = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), intransitive.verb = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), adjective = list(
        TRUE, FALSE, FALSE, TRUE, FALSE, FALSE), adverb = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, TRUE), conjunction = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), preposition = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), interjection = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), pronoun = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), definite.article = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), indefinite.article = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE), nominative = list(
        FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)), .Names = c("word", 
"pos.code", "pos", "noun", "plural", "noun.phrase", "verb.usually.participle", 
"transitive.verb", "intransitive.verb", "adjective", "adverb", 
"conjunction", "preposition", "interjection", "pronoun", "definite.article", 
"indefinite.article", "nominative"), row.names = c(NA, 6L), class = "data.frame")

write.table(DF2, file = "mobyPOS.csv", sep = " ", col.names = TRUE,qmethod = "double")

Полученное сообщение об ошибке:

> write.table(DF2, file = "mobyPOS.csv", sep = " ", col.names = TRUE,qmethod = "double")
Error in write.table(x, file, nrow(x), p, rnames, sep, eol, na, dec, as.integer(quote),  : 
  unimplemented type 'list' in 'EncodeElement'

Ответы [ 3 ]

15 голосов
/ 29 ноября 2011

Это просто предназначено для решения вопроса о списках в виде столбцов во фреймах данных, упомянутых в комментариях.

В конкретном случае данных вашего примера единственное место, где списки "обязательны", - этопервый элемент в DF2$pos, который является вектором длины два.Это можно удалить с помощью следующего кода:

DF2$pos[[1]] <- paste(DF2$pos[[1]],collapse = "")
newDF <- as.data.frame(lapply(DF2,unlist))

Как правило, метафора фрейма данных состоит в том, что строки соответствуют наблюдениям или единицам наблюдения, а столбцы соответствуют переменным.Кроме того, эта метафора утверждает, что конкретная наблюдательная единица имеет только одно значение для каждой переменной.В этом смысле он такой же, как матрица, только он может хранить столбцы разных классов.

Очевидно, что R позволяет вам разрушить эту метафору, как вы обнаружили.Вопрос о том, будет ли это хорошей идеей, будет зависеть от предметной области и данных.Не каждый набор данных идеально вписывается в метафору фрейма данных;иногда у вас будет переменная, в которой измеряемые вами «значения» нелегко свернуть в одно выражение.

У вас будет выбор: в вашем случае использование newDF вместо этого может потребоватьиспользовать разбор строк (strsplit и т. д.) каждый раз, когда вы получаете доступ к этому значению.Временами это может быть неловко, и может не соответствовать вашей ментальной модели ваших данных.

С другой стороны, большая часть R строится вокруг вещей, хранящихся в фреймах данных способами, которые соответствуютметафора фрейма данных.Как вы обнаружили с write.csv, если вы не придерживаетесь этих ожиданий, некоторые части (на самом деле, много частей) R не будут вести себя так, как вы ожидаете.Это также потребует дополнительной работы и неловкости.

По моему опыту, обычно лучше пожертвовать чистотой вашей предвзятой идеи о том, как ваши данные должны быть структурированными, и вместо этого делать все возможное, чтобы соответствоватьэто как-то во фрейм данных.По крайней мере, этот маршрут включал меньше обходных путей для меня.Но ничто не может быть идеальным.

Но, как я сказал в начале, это будет исключительно для конкретных данных и предметной области.YMMV.

7 голосов
/ 29 ноября 2011

Попробуйте

save(DF2, file = "mobyPOS.Rdata")

Обратите внимание, что вам не нужно использовать расширение "Rdata", но оно или "RData" кажутся соглашением.

Затем вы можете загрузить данные обратно, используя

load("mobyPOS.Rdata")

Обратите внимание, что это отличается от чтения внешнего формата файла, где вы обычно делаете что-то вроде

your_object <- read.csv(...)

С помощью команды load он загружает объект напрямую, поэтому после выполнения команды load ваш объект DF2 будет там.

0 голосов
/ 29 марта 2017

может быть преобразовать в символы, а затем сохранить? DF2$pos <- as.character(DF2$pos)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...