2016-04-25 2 views
1

Я не знаю, если это возможно ...Как сохранить dataframe со списком в CSV-файл в R

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

Я хочу сохранить этот data.frame в файле CSV (это список списка, содержащие векторы):

> operacions<-list(list(Nom="Victor",Bolis= c("Negro","azul","verde")),list(Nom="Dani",Lapices=c(1:4))) 
> operacions 
[[1]] 
[[1]]$Nom 
[1] "Victor" 

[[1]]$Bolis 
[1] "Negro" "azul" "verde" 


[[2]] 
[[2]]$Nom 
[1] "Dani" 

[[2]]$Lapices 
[1] 1 2 3 4 

Но это дает мне ошибку:

> write.csv2(operacions, "file.csv",row.names = FALSE) 
Error in data.frame(list(Nom = "Victor", Bolis = c("Negro", "azul", "verde" : 
    arguments imply differing number of rows: 3, 4 
+1

Это не кадр данных, это список списков. Проблема здесь в том, что элементы имеют разные длины. 'Rapply (operacions, length)' возвращает '1 3 1 4'. Это проблема, потому что '.csv' требует фиксированной длины. Каким будет ожидаемый формат вывода? – Laterow

+0

Это может ответить на ваш вопрос: http://stackoverflow.com/a/27594769/5805670 – Laterow

ответ

2

Поскольку это не data.frame и, более конкретно, не могут быть принуждены к одному с as.data.frame, из которого это сообщение пришло, вам нужно подумать о другом способе сохранения данных. Вероятно, это самый простой будет с dput, который пишет представление ASCII структуры списка:

dput(operacions, file="out.txt") 

Чтобы вернуть его обратно в R:

new <- source("out.txt") 

Другой метод будет конвертировать в формат JSON, который будет также сохранять информацию ключ-значение, а не просто писать значения:

library(jsonlite) 
toJSON(new) 
# value--------- 
{"value":[{"Nom":["Victor"],"Bolis":["Negro","azul","verde"]},{"Nom":["Dani"],"Lapices":[1,2,3,4]}],"visible":[true]} 

Вы можете использовать функцию кошки, чтобы направить это к текстовому фил е:

cat(toJSON(new), file="test.3.txt") 
0

кадров R данных и списки R потенциально несовместимы ...

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

Таким образом, это может быть проще, чтобы сохранить список как файл RDS с помощью saveRDS()

dataDir <- "." 
saveRDS(operacions, file.path(dataDir, "files")) 
operacions2 <- readRDS(file.path(dataDir, "files")) 

это сохранит его в качестве R-объекта, а так же, восстановить объект R позже.

Если вы хотите конвертировать в кадр данных, вы можете сначала преобразовать во вложенный фрейм данных, а затем заполнить пробелы в кадре данных. Таким образом, ...

require(data.table) 
require(plyr) 


operacions<-list(list(Nom="Victor",Bolis= c("Negro","azul","verde")),list(Nom="Dani",Lapices=c(1:4))) 
str(operacions) 
operacionsdf <- lapply(operacions, data.frame, stringsAsFactors = FALSE) 
str(operacionsdf) 

operacionsdf2 <- rbind.fill(operacionsdf) 
str(operacionsdf2) 
write.csv2(operacionsdf2, "file.csv",row.names = FALSE) 
operacionsdf3 <- read.csv2("file.csv") 
str(operacionsdf3) 

выход:

> require(data.table) 
> require(plyr) 
> operacions<-list(list(Nom="Victor",Bolis= c("Negro","azul","verde")),list(Nom="Dani",Lapices=c(1:4))) 
> str(operacions) 
List of 2 
$ :List of 2 
    ..$ Nom : chr "Victor" 
    ..$ Bolis: chr [1:3] "Negro" "azul" "verde" 
$ :List of 2 
    ..$ Nom : chr "Dani" 
    ..$ Lapices: int [1:4] 1 2 3 4 
> operacionsdf <- lapply(operacions, data.frame, stringsAsFactors = FALSE) 
> str(operacionsdf) 
List of 2 
$ :'data.frame': 3 obs. of 2 variables: 
    ..$ Nom : chr [1:3] "Victor" "Victor" "Victor" 
    ..$ Bolis: chr [1:3] "Negro" "azul" "verde" 
$ :'data.frame': 4 obs. of 2 variables: 
    ..$ Nom : chr [1:4] "Dani" "Dani" "Dani" "Dani" 
    ..$ Lapices: int [1:4] 1 2 3 4 
> operacionsdf2 <- rbind.fill(operacionsdf) 
> str(operacionsdf2) 
'data.frame': 7 obs. of 3 variables: 
$ Nom : chr "Victor" "Victor" "Victor" "Dani" ... 
$ Bolis : chr "Negro" "azul" "verde" NA ... 
$ Lapices: int NA NA NA 1 2 3 4 
> write.csv2(operacionsdf2, "file.csv",row.names = FALSE) 
> operacionsdf3 <- read.csv2("file.csv") 
> str(operacionsdf3) 
'data.frame': 7 obs. of 3 variables: 
$ Nom : Factor w/ 2 levels "Dani","Victor": 2 2 2 1 1 1 1 
$ Bolis : Factor w/ 3 levels "azul","Negro",..: 2 1 3 NA NA NA NA 
$ Lapices: int NA NA NA 1 2 3 4 
Смежные вопросы