【问题标题】:Moving a list in a .csv file in R; cannot use `unlist` properly在 R 中移动 .csv 文件中的列表;无法正确使用“unlist”
【发布时间】:2014-02-19 17:45:53
【问题描述】:

我在 R 中生成了列表 L,其中

L <- list()
L[[1]] <-cbind ("Orks", "Eldar")      
L[[2]] <-cbind ("Nid", "Tau")   

和输出

> L
[[1]]
     [,1]  [,2]   
[1,] "Orks" "Eldar"

[[2]]
     [,1]  [,2] 
[1,] "Nid" "Tau"

我想编写一个带有以下输出的 .csv 文件

Number  Type
1       Orks, Eldar
2       Nid, Tau

即将列表组件 L[[i]] 转移到文件的第 i 行,具有上述拆分和列名。我开始使用处理列表

LL <- data.frame(matrix(unlist(L), nrow=2) )

但输出并不能说服我,因为在将它们发送到 .csv 文件之前,我不知道如何绑定 LL 列的同一行上的条目。

有没有一种蛮力的方式来达到上面的 .csv 结构,而不是玩弄unlist 及其结果?

非常感谢!

【问题讨论】:

  • ldply,在适当的条件下,也可以从 plyr 包中快速而肮脏地做到这一点。

标签: r list csv


【解决方案1】:

您需要使用I()(在formula 对象中更常用)来保护list 结构...

data.frame( Number = 1:length(L) , Type = I(L) )
#  Number        Type
#1      1 Orks, Eldar
#2      2    Nid, Tau

I() 是一个函数,用于...

更改对象的类以表明它应该被“按原样”对待

【讨论】:

  • 有趣:输出 df[1,2] 是一个 1x2 矩阵。知道为什么print 方法选择在其中添加逗号吗?
  • 非常巧妙的想法。强制列表进入数据框虽然有点不标准,但可能会导致难以理解的代码。注意write.csv 的输出也有点奇怪。
  • 不幸的是我无法改进write.csv 的输出;我相信这是因为数据框的每个元素都是一个矩阵,正如你们俩所指出的那样。有什么想法吗?:-)
  • @Avitus data.frame( Number = 1:length(L) , Type = do.call( paste , L ) ) 怎么样?这对你的输出有帮助吗?
  • @RichieCotton 实际上它是I() 的记录用例之一(但同意它不是很好用的)... 并确保矩阵作为单列插入。
【解决方案2】:

您可以使用以下方法更改数据的形状:

data.frame(
  Number = seq_along(L),
  Type   = vapply(L, toString, character(1))
)

如果您在值中使用逗号(如在Type 列中),您可能更喜欢使用制表符作为分隔符而不是逗号来保存文件。 (调用read.delim 代替read.csv。)R 将正确地用逗号引用值,但其他软件可能需要一些摆弄才能读取文件。

【讨论】:

  • 我将sapply 换成了vapply,因为当L 的长度为零时它可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2019-07-24
  • 2016-06-14
  • 2020-07-08
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多