我正尝试从一组字符列表中创建一个矩阵,如下所示:
list <- list("0010","0110","1000")
我想将其转换为具有4列(针对列表中每个元素的每个字符的每个字符)和3行的矩阵,如:
现在我需要将数字(0和1s)识别为数字。
感谢您的帮助!
用我的数据输出进行编辑,现在可以看到为什么出现该错误了。顺便说一句,非常感谢您提供的答案。看起来当使用扫描功能时,它也在列表中添加了文件名(我不知道如何解决此问题:
答案 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创建