出力と呼ばれる次の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を台無しにしている独自の引用符が含まれているようです。どうすれば修正できますか?
コメントで述べたように、あなたは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
列の数に関係なく、これを実行します。
df <- apply(df,2,as.character)
その後、write.csv
。
Data.tableパッケージには、data.tableの列がリストである場合でも、csvへのdata.tableオブジェクトの書き込みを適切に処理する新しい関数(2016年11月に導入)があります。
fwrite(data.table, file ="myDT.csv")
別の簡単なソリューション。 1つ以上の列のタイプはlist
なので、「文字」またはデータフレームに変換する必要があります。簡単な解決策が2つあります
次を使用して各列を「as.character」に変換します
df$col1 = as.character(df$col1)
df$col2 = as.character(df$col2)
.......等々
最適なものはdf
を「マトリックス」に変換します
df = as.matrix(df)
df
をcsvに書き込みます。私のために働く。
想定
保存するパスはPath
、つまりpath=Path
df
は保存するデータフレームです。
以下の手順に従ってください:
df
をtxtドキュメントとして保存:
write.table(df,"Path/df.txt",sep="|")
テキストファイルをRに読み込みます。
Data = read.table("Path/df.txt",sep="|")
ここでcsvとして保存します:
write.csv(Data, "Path/df.csv")
それでおしまい。
これらはすべてエレガントなソリューションです。
既製のパッケージよりも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")