子集从列表列表

时间:2017-01-27 17:10:14

标签: r matrix

我在操作我从列表列表中创建的矩阵时遇到了一些麻烦。我真的不明白为什么生成的矩阵不像普通矩阵那样。也就是说,我希望当我为其子集一个列来返回一个向量时,我得到一个列表。这是一个有效的例子:

x = list()
x[[1]] = list(1, 2, 3)
x[[2]] = list(4, 5, 6)
x[[3]] = list(7, 8, 9)

y = do.call(rbind, x)
y
     [,1] [,2] [,3]
[1,] 1    2    3   
[2,] 4    5    6   
[3,] 7    8    9  

y采用我期望的格式。最后我会得到一些我想要平均的矩阵列表,但是我一直得到一个错误,这似乎是因为当你对这个矩阵进行子集时你得到的是列表而不是向量。

y[,1]
[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 7

有谁知道a)为什么会这样?和b)我如何避免/解决这个问题?

提前致谢

3 个答案:

答案 0 :(得分:1)

这只是“列表矩阵”的另一个问题。你需要

do.call(rbind, lapply(x, unlist))

甚至更简单:

matrix(unlist(x), nrow = length(x), byrow = TRUE)

如果您需要阅读背景资料,请参阅:Why a row of my matrix is a list。这是一个比你更复杂的案例。

答案 1 :(得分:1)

看起来问题是由于x是列表列表而不是向量列表。这不是很好,但它会起作用:

y = do.call(rbind, lapply(x, unlist))

答案 2 :(得分:0)

do.call分别为每个列表传递参数,因此您实际上只是将三个列表绑定在一起。这解释了为什么在调用元素时它们采用列表格式。

取消列出x,然后使用sapply创建矩阵。由于R默认首先填充列,因此您需要对其进行转置以获得所需的矩阵。

    String s = "HelloWorld";
    String y ="";
    Character c = '*';
    int length = s.length();

    for(int i = 1; i<= length; i++) {
        if(i == length)
            y += s.substring(i-1, i);
        else
            y += s.substring(i-1, i) + c;
    }

    System.out.println(y);