【问题标题】:CSV output in R includes quotes and extra charactersR 中的 CSV 输出包括引号和额外字符
【发布时间】:2015-07-24 21:15:48
【问题描述】:

我在 R 中有一个很长的列表(“mylist”),其中包含我想要导出到 .csv 的字符序列,这样每个单元格都包含 1 个字符:

> str(mylist)
List of 1
 $ :List of 259
  ..$ : chr [1:214] "A" "B" "C" "D" ...
  ..$ : chr [1:220] "E" "F" "G" "H" ...

当我对此使用 write.csv 时,我收到一个错误,因为列表包含不同数量的行。美好的。所以我尝试:

mynewlist<-do.call("cbind", mylist)
write.csv(t(mynewlist), file="mynewlist.csv", quote = FALSE)

但我明白了

    V1        V2     V3       V4    V5
1   c("A"    "B"     "C"     "D"    ...

作为我在 excel 中加载时的输出,它仍然包含双引号以及在第一个单元格中看到的“c(”。此外,虽然 CSV 的第一行应该有 214 列,但它会换回一个新的排在 101 个单元格之后。write.csv 和 write.table 函数看起来非常简单,我的数据集也是如此,所以我不确定这里发生了什么。有什么想法为什么我不能得到一个干净的 CSV 导出?谢谢!

【问题讨论】:

  • 你应该创建一个reproducible example。给出mylist 的特定样本(dput() 会很有帮助)并写出该样本输入的所需输出。
  • 所需的输出如最后一个代码框中所示,但没有引号,V1,1 中没有“c(”,并且没有描述的行换行。

标签: r


【解决方案1】:

write.table 仅在您使用它一次写入所有行时才关心数据格式。您可以简单地将其包装在一个循环中:

mylist <- list(sample(letters,10), sample(letters,20))

# write in a loop
for(i in mylist) write.table(t(i), "mytext.csv", quote=F, append=T, 
                 col.names=F, row.names=F)

结果文件的内容:

n v w x d y o k u m
w p z d x o u i s h y r f b c l e k m v

请注意,如果该文件已存在,append=T 不会向您发出警告,因此如有必要,最好检查一下。

【讨论】:

  • 谢谢!这确实有效,但似乎应该有一些更简单的东西也应该有效,不需要循环和附加。
【解决方案2】:

目前还不清楚你想要实现什么。使用write.csv(),您首先需要一个 data.frame,但您有一个由不同长度的字符串向量组成的列表。

如果您只想将一个列表项的所有字符写在一行中,用逗号分隔,这是我会使用的:

for( i in mylist ) cat( file = "myfile.csv", i, "\n", sep = ",", append = TRUE )

如果您想先构建一个 data.frame,然后可以使用write.csv() 保存到文件中,事情就有点复杂了。优点可能是(取决于您接下来的步骤)所有行的长度相同。

# get max length of of list items
longest <- max( sapply( mylist, length ) )
# initialize data.frame
myDF <- NULL
# loop through your list and make it a data.frame (matrix, actually)
for( i in 1 : length( mylist ) )
{
  # fill up with empty strings
  empty <- longest - length( mylist[[ i ]] )
  mylist[[ i ]] <- c( mylist[[ i ]], rep( "", empty ) )
  # append to data.frame
  myDF <- rbind( myDF, mylist[[ i ]] )
}
# now you can juse write.csv()
write.csv( myDF, "myfile.csv" )

我想这有点矫枉过正,但以防万一......

【讨论】:

    猜你喜欢
    • 2016-09-07
    • 2016-12-05
    • 1970-01-01
    • 2015-03-22
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多