r - R:如何重新排列列表对象
问题描述
mylist <- list(matrix(c(1, 2, 3, "red", "blue", "green", "apple", "banana", "orange"), ncol = 3, nrow = 3),
matrix(c(2, 3, 9, "green", "blue", "green", "apple", "guava", "orange"), ncol = 3, nrow = 3),
matrix(c(43, 90, 1, "black", "red", "green", "orange", "watermelon", "orange"), ncol = 3, nrow = 3))
> mylist
[[1]]
[,1] [,2] [,3]
[1,] "1" "red" "apple"
[2,] "2" "blue" "banana"
[3,] "3" "green" "orange"
[[2]]
[,1] [,2] [,3]
[1,] "2" "green" "apple"
[2,] "3" "blue" "guava"
[3,] "9" "green" "orange"
[[3]]
[,1] [,2] [,3]
[1,] "43" "black" "orange"
[2,] "90" "red" "watermelon"
[3,] "1" "green" "orange"
在mylist
中,我有 3 个子列表。每个子列表包含一个 3x3 矩阵,其中第一列包含数字,第二列包含颜色,第三列包含水果。
我想重新排列这些子列表,使第一个子列表中的矩阵包含数字,第二个包含颜色,第三个包含水果。也就是说,我希望它看起来像这样:
[[1]]
[,1] [,2] [,3]
[1,] 1 2 43
[2,] 2 3 90
[3,] 3 9 1
[[2]]
[,1] [,2] [,3]
[1,] "red" "green" "black"
[2,] "blue" "blue" "red"
[3,] "green" "green" "green"
[[3]]
[,1] [,2] [,3]
[1,] "apple" "apple" "orange"
[2,] "banana" "guava" "watermelon"
[3,] "orange" "orange" "orange"
我的直觉是用来lapply
循环遍历矩阵的列并将它们存储在一个新列表中,但我不确定如何有效地解决这个问题。
解决方案
您可以绑定、按列拆分并转换回矩阵:
lapply(asplit(do.call(rbind, mylist), 2), matrix, 3)
[[1]]
[,1] [,2] [,3]
[1,] "1" "2" "43"
[2,] "2" "3" "90"
[3,] "3" "9" "1"
[[2]]
[,1] [,2] [,3]
[1,] "red" "green" "black"
[2,] "blue" "blue" "red"
[3,] "green" "green" "green"
[[3]]
[,1] [,2] [,3]
[1,] "apple" "apple" "orange"
[2,] "banana" "guava" "watermelon"
[3,] "orange" "orange" "orange"
推荐阅读
- node.js - 使用 Node.js 签署数字签名
- sql-server - system.data.sqlclientexception:'@p2' 附近的语法不正确
- azure - Is it possible to use the Azure CLI for setting up a monitoring URL Ping test?
- c# - 从 ASP.NET MVC 应用程序将 docx 转换为 pdf
- python - 使用 Python 移动时间段并计算 Delta
- terraform - 在 Terraform 中创建现有 aws_instance 资源的列表
- python - 如何使用字典存储 Python 中方法生成的文件名?
- python - 使用绝对导入运行单个 Python 文件时出现 ModuleNotFoundError
- scala - Spark UDF 没有正确给出滚动计数
- powerbi - 任何可用于替换现有表格并应用所有步骤的工具