R将列表转换为矩阵

时间:2018-11-09 11:20:04

标签: r list matrix

我正尝试从一组字符列表中创建一个矩阵,如下所示:

list <- list("0010","0110","1000")

我想将其转换为具有4列(针对列表中每个元素的每个字符的每个字符)和3行的矩阵,如:

enter image description here

现在我需要将数字(0和1s)识别为数字。

感谢您的帮助!

用我的数据输出进行编辑,现在可以看到为什么出现该错误了。顺便说一句,非常感谢您提供的答案。看起来当使用扫描功能时,它也在列表中添加了文件名(我不知道如何解决此问题:

first element

second element

1 个答案:

答案 0 :(得分:2)

从您的问题来看,您是否真的想使用列表或向量还不清楚;同样,我将避免将变量命名为与函数名相同的变量,例如list。解决方法如下:

# Try it with l as a list
l <- list("0010","0110","1000")
t(sapply(l, function(x) as.numeric(unlist(strsplit(x, '')))))
#>      [,1] [,2] [,3] [,4]
#> [1,]    0    0    1    0
#> [2,]    0    1    1    0
#> [3,]    1    0    0    0
# Try it with l as a vector
l <- c("0010","0110","1000")
t(sapply(l, function(x) as.numeric(unlist(strsplit(x, '')))))
#>      [,1] [,2] [,3] [,4]
#> 0010    0    0    1    0
#> 0110    0    1    1    0
#> 1000    1    0    0    0

reprex package(v0.2.1)于2018-11-09创建

说明

sapply(x, fun)将函数fun应用于x的每个元素。所以,

sapply(l, function(x) as.numeric(unlist(strsplit(x, ''))))

接受l的每个元素,使用strsplit(x, '')从该元素中获取每个字符(每个"0""1"),那么我们必须unlist()因为strsplit()返回一个列表,所以需要数字就将其包装在as.numeric()中,并且当t()返回矩阵时,我们必须将所有结果都包装在sapply()中按列。

更新

从更新后的问题来看,您的列表元素似乎根本不是字符形式。在这种情况下,我会遵循现已删除的答案的建议,并使用Reduce()rbind()

l <- list('digist/test_digits/0_0.txt' = c(0, 0, 1, 0),
          'digist/test_digits/0_1.txt' = c(0, 1, 1, 0),
          'digist/test_digits/1_1.txt' = c(1, 0, 0, 0))
l
#> $`digist/test_digits/0_0.txt`
#> [1] 0 0 1 0
#> 
#> $`digist/test_digits/0_1.txt`
#> [1] 0 1 1 0
#> 
#> $`digist/test_digits/1_1.txt`
#> [1] 1 0 0 0
Reduce('rbind', l)
#>      [,1] [,2] [,3] [,4]
#> init    0    0    1    0
#>         0    1    1    0
#>         1    0    0    0

reprex package(v0.2.1)于2018-11-09创建