2016-04-25 15 views
1

可能かどうかわからない...リストを含むデータフレームをRsで保存する方法

今後のセッションでインポートするようにファイルを保存します。

私はcsvファイルでこのdata.frameを保存したい(それはリストのリストを含むベクターです):

> 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で強制的に強制することはできません。データを保存する別の方法を考える必要があります。 、もう一つの方法は、JSON形式に変換することです

new <- source("out.txt") 

た:バックRにそれを持って来るために

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

:おそらくこれが最も簡単なのは、リスト構造のASCII表現を書き込みdput、となります

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

この機能を使用すると、これをテキストファイルにすることができますE:

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

Rデータフレーム及びRリストは、潜在的に互換性がない...

リストは、本質的に、各要素は、要素の異なるタイプおよび長さのものとすることができるベクターです。一方、データフレームは、各列が異なるタイプのデータ、またはネストされていないリストを格納できる均一なスプレッドシートと考えることができます各要素は同じ長さですです。リストが不等長を持つことができ、データフレームは長さを持たないので、この最後の点は重要です。

したがって、R-オブジェクトとして保存し、同様に、以降のRオブジェクトが復元されsaveRDS()

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

を使用してRDSファイルとしてリストを保存することが容易であってもよいです。

データフレームに変換する場合は、最初にネストされたデータフレームに変換してからデータフレームの空白を埋め込むことができます。このように...

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 
関連する問題