我有以下data.table(data.frame),名为output:
> 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?
我注意到的另一个奇怪的事情是,如果我写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。我该如何解决这个问题?
答案 0 :(得分:20)
正如评论中所提到的,你应该可以做这样的事情(未经测试)以获得&#34;展平&#34;将list
转换为字符向量:
output$Title <- vapply(output$Title, paste, collapse = ", ", character(1L))
如前所述,如果你想尝试unlist
方法,你可以&#34;扩展&#34;每行由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
答案 1 :(得分:18)
执行此操作,无论您拥有多少列:
df <- apply(df,2,as.character)
然后执行write.csv
。
答案 2 :(得分:9)
在data.table包中有一个新函数(在2016年11月引入),它可以很好地处理将data.table对象写入csv,即使在data.table的列是列表的情况下也是如此。
fwrite(data.table, file ="myDT.csv")
答案 3 :(得分:7)
另一个简单的解决方案。也许一个或多个列的类型为list
,因此我们需要将它们转换为“字符”或数据框。所以有两个简单的解决方案
使用 -
转换每列“as.character” df$col1 = as.character(df$col1)
df$col2 = as.character(df$col2)
.......等等
最好的将df
转换为“矩阵”
df = as.matrix(df)
现在将df
写入csv。适合我。
答案 4 :(得分:1)
假设
您要保存到的路径为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")
就是这样。
答案 5 :(得分:0)
这些都是优雅的解决方案。
对于那些喜欢使用R代码而不是现成软件包的好奇读者来说,这是一个R函数,该函数返回一个非列表数据框,可以将其导出并另存为.csv。
输出是有问题的“麻烦的”数据帧。
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")