【问题标题】:Convert a vector of lists with uneven length to a matrix将长度不均匀的列表向量转换为矩阵
【发布时间】:2017-01-07 22:17:13
【问题描述】:

我有一个向量,一个只有一列的数据框,其中包含不均匀长度的列表:

data = list(
c(349, 364, 393, 356, 357, 394, 334, 394, 343, 365, 349),
c(390, 336, 752, 377),
c(670, 757, 405, 343, 1109, 350, 372),
c(0, 0),
c(),
c(1115, 394, 327, 356, 408, 329, 385, 357, 357))

我想将其转换为矩阵,用NA 填补空白。 所以它应该看起来像这样:

349, 364, 393, 356, 357, 394, 334, 394, 343, 365, 349
390, 336, 752, 377, NA,  NA,  NA,  NA,  NA,  NA,  NA
670, 757, 405, 343, 1109,350, 372, NA,  NA,  NA,  NA
0,   0,   NA,  NA,  NA,  NA,  NA,  NA,  NA,  NA,  NA
NA,  NA,  NA,  NA,  NA,  NA,  NA,  NA,  NA,  NA,  NA                     
1115,394, 327, 356, 408, 329, 385, 357, 357, NA,  NA 

最终,甚至摆脱了只有NAs 的行。我试过了

data = sapply(data[,1], FUN=unlist)

然后

data = sapply(data, '[', seq(max(sapply(data, length))))

但我不断得到一个矩阵,其中所有未列出的元素在一列中。请指教。

【问题讨论】:

  • 您的data 出现错误。请检查错字。你的意思是list 而不是as.vector
  • 是的,对不起。现已更正。它实际上是由aggregate 函数产生的一列数据框
  • 可能,您在aggregatelist unique 元素中使用了list 作为FUN
  • 不,我实际上在aggregate 中使用了FUN=diff 以获取具有相同标识符的连续行之间的时间差

标签: r list matrix coercion


【解决方案1】:

我猜“数据”应该是list 而不是vector,那么代码就可以了

t(sapply(data, `length<-`, max(lengths(data))))

注意:lengths 是替代 sapply(data, length) 的更快选项(在最近的 R 版本中引入)

数据

data = list(
  c(349, 364, 393, 356, 357, 394, 334, 394, 343, 365, 349),
  c(390, 336, 752, 377),
  c(670, 757, 405, 343, 1109, 350, 372),
  c(0, 0),
  numeric(0),
  c(1115, 394, 327, 356, 408, 329, 385, 357, 357))

【讨论】:

  • 谢谢。有用。在我的例子中,作为一个只有一列的data.frame,来自aggregate 函数,我不得不做t(sapply(data[,1], `length&lt;-`, max(lengths(data[,1])))) 当然它总是可以被强制的。再次感谢!
猜你喜欢
  • 2018-03-01
  • 2018-04-23
  • 2015-01-30
  • 2014-03-09
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多