【问题标题】:split a matrix and save in separate variables in a loop拆分矩阵并在循环中保存在单独的变量中
【发布时间】:2018-06-17 13:27:41
【问题描述】:

我有一个 m*n 矩阵的数据。我想按列拆分矩阵并将每一列分别保存在不同的向量中。 例如

data<-matrix(1:9, ncol=3)

我想让vec1 包含第一列所以

vec1 将转置[1,2,3],一个维度为 3*1 的列矩阵,基本上是第一列数据。同样,vec2 代表第二列,vec3 代表最后一列。

我知道我可以通过重复手动执行此操作

vec1<-data[,1], 
vec2<-data[,2] 
... 
vecn<-data[,n]. 

但是,当 n 很大时,这是不可行的。 所以我想知道使用循环来做到这一点是否可行。

【问题讨论】:

  • 欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 这是一个非常糟糕的想法——顺序命名的变量比一个好的矩阵更难处理。它们不能很好地扩展,它们经常导致复制/粘贴和查找/替换由拼写错误引起的错误......你为什么要这样做?更大的问题是什么?使用list 是将它们保存在单个对象中的好方法,以防矩阵不合适。您可能想阅读How do I make a list of data frames 进行相关讨论。
  • @Gregor 感谢您的评论。我正在做一个项目,使用前 10 秒的数据确定下一秒对象的位置。物体的位置由 10 个关节确定,每个关节有 3 个坐标。因此,我需要对所有 30 个坐标进行预测才能得到预测。所以我打算用30个变量代表30个坐标,循环从数据清洗到建模的所有过程。
  • 我认为如果您使用单个矩阵或单个列表来保存所有 30 个坐标,您的代码结构会容易得多。使用 apply 函数对矩阵的列进行循环进行了高度优化 - 您将增加代码的复杂性并通过从矩阵中取出变量来降低效率。与矩阵相比,data.frames 特别慢。
  • 而且,我应该补充一点,即使您需要将它们作为数据框插入到其他功能中,您也可以只使用apply(your_matrix, 2, function(x) other_function(data.frame(X1 = x))) 而不会用n 单列数据框弄乱您的工作区.

标签: r variables matrix


【解决方案1】:

正如已经指出的那样,这可能不是一个好主意。但是,如果您仍然觉得需要沿着这条路继续前进,而不是使用list 或仅使用源matrix 本身,最简单的方法可能是使用list2envdata.frame 的组合。

这是一个演示,一步一步:

data <- matrix(1:9, ncol=3)

ls()  # Only one object in my workplace
# [1] "data"

data_list <- unclass(data.frame(data))
str(data_list)
# List of 3
#  $ X1: int [1:3] 1 2 3
#  $ X2: int [1:3] 4 5 6
#  $ X3: int [1:3] 7 8 9
#  - attr(*, "row.names")= int [1:3] 1 2 3

ls() # Two objects now
# [1] "data"      "data_list"

list2env(data_list, envir = .GlobalEnv)

ls() # Five objects now
# [1] "data"      "data_list" "X1"        "X2"        "X3"  

X1
# [1] 1 2 3

如果要单列data.frames,可以使用split.list

list2env(setNames(split.default(data.frame(data), seq(ncol(data))), 
                  paste0("var", seq(ncol(data)))), envir = .GlobalEnv)
var1
#   X1
# 1  1
# 2  2
# 3  3

将这些放在一起,您实际上可以一次完成所有操作(无需先创建“data_list”),如下所示:

list2env(data.frame(data), envir = .GlobalEnv)

但同样,您应该有充分的理由这样做!

【讨论】:

  • 感谢您的帮助。然而,这不是我想要的。使用 for 循环、assign 和 paste() 可以获得类似的结果。就像我想要所有 v1、v2... 都有 data.frame 一样。无论如何,感谢您的帮助。
  • @user9184644,“这不是我想要的”是什么意思? X1、X2 等是您的列作为单独的向量....
  • 感谢您的帮助。让我试试这个。
猜你喜欢
  • 2019-06-06
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
相关资源
最近更新 更多