web-dev-qa-db-ja.com

write.tableの試行時の未実装のタイプリスト

出力と呼ばれる次のdata.table(data.frame)があります。

> head(output)
        Id                                           Title IsProhibited
1 10000074                             Renault Logan, 2005            0
2 10000124              Ñêëàäñêîå ïîìåùåíèå, 345 ì<U+00B2>            0
3 10000175                                          Ñó-øåô            0
4 10000196             3-ê êâàðòèðà, 64 ì<U+00B2>, 3/5 ýò.            0
5 10000387        Samsung galaxy S4 mini GT-I9190 (÷¸ðíûé)            0
6 10000395 Êàðòèíà ""Êðûì. Ïîñåëîê Àðîìàò"" (õîëñò, ìàñëî)            0

私はそれをCSVにエクスポートしようとしています:

> write.table(output, 'output.csv', sep = ',', row.names = FALSE, append = T)

ただし、そうすると次のエラーが表示されます。

Error in .External2(C_writetable, x, file, nrow(x), p, rnames, sep, eol,  : 
unimplemented type 'list' in 'EncodeElement'
In addition: Warning message:
In write.table(output, "output.csv", sep = ",", row.names = FALSE,  :
  appending column names to file

Titleを文字列に変換して、タイプlistでなくなるようにしようとしました。

toString(output$Title)

しかし、私は同じエラーを受け取ります。私のタイプは次のとおりです。

> class(output)
[1] "data.frame"
> class(output$Id)
[1] "integer"
> class(output$Title)
[1] "list"
> class(output$IsProhibited)
[1] "factor"

Data.frameをCSVにエクスポートする方法を教えてもらえますか?

私が気づいたもう1つの奇妙なことは、head(output)を書くとテキストが適切にエンコードされないことです(上に示したように)、単純にoutput$Title[0:3]を書くとテキストは正しく表示されます:

> output$Title[0:3]
[[1]]
[1] "Renault Logan, 2005"

[[2]]
[1] "Складское помещение, 345 м²"

[[3]]
[1] "Су-шеф"

それに関するアイデアはありますか?それは私の最初の問題に関連していますか?

編集:ここに私の新しい出力があります:

Id  Title   IsProhibited    
10000074    Renault Logan, 2005 0   
10000124    СкладÑкое помещение, 345 м<U+00B2>    0   
10000175    Су-шеф 0   
10000196    3-к квартира, 64 м<U+00B2>, 3/5 ÑÑ‚.  0   
10000387    Samsung galaxy S4 mini GT-I9190 (чёрный)  0   
10000395    Картина \\"Крым. ПоÑелок Ðромат\"\" (холÑÑ‚     маÑло)"    0
10000594    КальÑн 25 Ñм  0   
10000612    1-к квартира, 45 м<U+00B2>, 6/17 ÑÑ‚. 0   
10000816    Гараж, 18 м<U+00B2>   0   
10000831    Платье    0   
10000930    Карбюраторы К-22И, К-22Г от газ 21 и газ 51 0   

行ID 10000395が台無しになっていることに注意してください。 CSVを台無しにしている独自の引用符が含まれているようです。どうすれば修正できますか?

28
user1477388

コメントで述べたように、あなたはlistを文字ベクトルに「フラット化」するために、次のような(テストされていない)ことができるはずです:

output$Title <- vapply(output$Title, paste, collapse = ", ", character(1L))

また、前述のように、unlistアプローチを試したい場合は、output$Titleの個々の値で各行を「拡張」できます。

x <- vapply(output$Title, length, 1L)          ## How many items per list element
output <- output[rep(rownames(output), x), ]   ## Expand the data frame
output$Title <- unlist(output$Title, use.names = FALSE)  ## Replace with raw values
21

列の数に関係なく、これを実行します。

df <- apply(df,2,as.character)

その後、write.csv

19

Data.tableパッケージには、data.tableの列がリストである場合でも、csvへのdata.tableオブジェクトの書き込みを適切に処理する新しい関数(2016年11月に導入)があります。

fwrite(data.table, file ="myDT.csv")
11
llrs

別の簡単なソリューション。 1つ以上の列のタイプはlistなので、「文字」またはデータフレームに変換する必要があります。簡単な解決策が2つあります

  1. 次を使用して各列を「as.character」に変換します

    df$col1 = as.character(df$col1)

    df$col2 = as.character(df$col2)

    .......等々

  2. 最適なものはdfを「マトリックス」に変換します

    df = as.matrix(df)

dfをcsvに書き込みます。私のために働く。

7
Ravi kumar

想定

  • 保存するパスはPath、つまりpath=Path

  • dfは保存するデータフレームです。

以下の手順に従ってください:

  1. dftxtドキュメントとして保存:

    write.table(df,"Path/df.txt",sep="|")
    
  2. テキストファイルをRに読み込みます。

    Data = read.table("Path/df.txt",sep="|")
    
  3. ここでcsvとして保存します:

    write.csv(Data, "Path/df.csv")
    

それでおしまい。

1
K.Pascal

これらはすべてエレガントなソリューションです。

既製のパッケージよりもRコードを好む好奇心reader盛な読者向けに、.csvとしてエクスポートおよび保存できる非リストデータフレームを返すR関数を紹介します。

出力は、問題の「厄介な」データフレームです。

df_unlist<-function(df){

df<-as.data.frame(df)

nr<-nrow(df)

c.names<-colnames(df)

lscols<-as.vector(which(apply(df,2,is.list)==TRUE))

if(length(lscols)!=0){

for(i in lscols){

temp<-as.vector(unlist(df[,i]))

if(length(temp)!=nr){

adj<-nr-length(temp)

temp<-c(rep(0,adj),temp)

}

df[,i]<-temp

} #end for

df<-as.data.frame(df)

colnames(df)<-c.names
}
return(df)
}

データフレームの「出力」に関数を適用します。

newDF<-df_unlist(output)

次に、apply()を使用して、新しい(newDF)データフレームが「リスト」されていないことを確認できます。これにより、FALSEが正常に返されます。

apply(newDF,2,is.list)         #2 for column-wise step.

新しいデータフレームnewDFを.csvファイルとして選択したパスに保存します。

write.csv(newDF,"E:/Data/newDF.csv")
0
K.Pascal