R语言 尝试写入.table时出现未实现的类型列表

qaxu7uf2  于 2022-12-06  发布在  其他
关注(0)|答案(7)|浏览(442)

我把下面的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吗?
我注意到的另一件奇怪的事情是,如果我写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。我该如何修复?

hwamh0ep

hwamh0ep1#

无论您有多少列,请执行以下操作:

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

然后做write.csv

zkure5ic

zkure5ic2#

正如在评论中提到的,你应该能够做一些类似这样的事情(未经测试)来把你的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
llmtgqce

llmtgqce3#

data.table包中有一个新函数(2016年11月引入),它可以很好地处理将data.table对象写入csv的问题,即使在data.table的列是列表的情况下也是如此。

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

e37o9pze4#

另一个简单的解决方案。可能一个或多个列是list类型,所以我们需要将它们转换为“字符”或数据框。因此有两个简单的解决方案
1.使用--将每列“转换为.character”
df$col1 = as.character(df$col1)
df$col2 = as.character(df$col2)
.......等等
1.最好的一个把df转换成一个“矩阵”
df = as.matrix(df)
现在将df写入csv。对我有效。

yizd12fk

yizd12fk5#

这些都是优雅的解决方案。
对于那些更喜欢R代码而不是现成的包的好奇的读者来说,这里有一个R函数,它返回一个非列表 Dataframe ,可以导出并保存为. csv。
输出是所讨论的“麻烦” Dataframe 。

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)
}

在 Dataframe “输出”上应用函数:

newDF<-df_unlist(output)

接下来,您可以通过apply()确认新的(newDF) Dataframe 没有“列出”。这应该会成功返回FALSE。

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

继续将新 Dataframe newDF作为.csv文件保存到您选择的路径。

write.csv(newDF,"E:/Data/newDF.csv")
xytpbqjk

xytpbqjk6#

假设

  • 要保存的路径为Path,即path=Path
  • df是要保存的 Dataframe ,

请执行以下步骤:
1.将df另存为 txt 文档:

write.table(df,"Path/df.txt",sep="|")

1.将文本文件读入R:

Data = read.table("Path/df.txt",sep="|")

1.现在保存为 csv

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

就这样了

vddsk6oq

vddsk6oq7#

# First coerce the data.frame to all-character
df = data.frame(lapply(output, as.character), stringsAsFactors=FALSE)

# write file
write.csv(df,"output.csv")

相关问题