如何从列表中创建没有维名称的矩阵

时间:2016-08-21 15:24:08

标签: r list matrix

我有一个清单:

direc <- structure(list(no_trades = 3L, sell_trades = 19L, buy_trades = 18L), .Names = c("no_trades", "sell_trades", "buy_trades"))
# $no_trades
# [1] 3
# 
# $sell_trades
# [1] 19
# 
# $buy_trades
# [1] 18

我想在此列表中创建一个没有维度名称的矩阵。这与此矩阵结构类似:

classified <- structure(c(9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13, 9, 6, 13), .Dim = c(3L, 15L))
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
# [1,]    9    9    9    9    9    9    9    9    9     9     9     9     9     9     9
# [2,]    6    6    6    6    6    6    6    6    6     6     6     6     6     6     6
# [3,]   13   13   13   13   13   13   13   13   13    13    13    13    13    13    13

我尝试了另一个用于数据帧到矩阵转换的SO question代码:

m2 <- `dimnames<-`(as.matrix(direc), NULL)

但它又给了我一个清单:

  

结构(列表(3L,19L,18L),. Dim = c(3L,1L))

提前感谢您的回答。

1 个答案:

答案 0 :(得分:1)

此处'direc'为list,转换为matrixas.matrix不会直接转换,但我们可以matrix将其更改为rbind/cbind }}。最初的direc元素都是integer类。如果我们需要numeric类,则需要转换

m1 <- `dimnames<-`(do.call(cbind, lapply(direc, as.numeric)), NULL)
dput(m1)
#structure(c(3, 19, 18), .Dim = c(1L, 3L))

如果list元素的长度不相等,那么在执行cbind

之前用NA填充可能会更好
`dimnames<-`(do.call(cbind, lapply(direc, `length<-`, max(lengths(direc)))), NULL)

要理解为什么as.matrix在这里不起作用,我们可以查看methods的{​​{1}}

list

它没有methods(class = "list") #[1] all.equal as.data.frame as.data.table as_data_frame #[5] coerce escape melt Ops relist #[10] sotrunc within 选项。