【问题标题】:Writing a loop to slice a matrix in R编写循环以在 R 中对矩阵进行切片
【发布时间】:2018-09-01 11:50:50
【问题描述】:

我有一个非常基本的循环问题:

我有一个矩阵 (365x20)。所以二十年来我每天都有降雨数据。

我需要对矩阵进行切片以便进行接下来的分析步骤,我这样做是这样的:

year1 <- as.vector(Rainfall_data$year1)                   
year2 <- as.vector(Rainfall_data$year2)             
...         
year20 <- as.vector(Rainfall_data$year20)

这给了我总共 20 个单个 1x365 向量。

现在,我想对转置的 Rainfall 数据执行相同的操作,以获得包含所有 20 年同一天的值的向量。因为这意味着做

as.vector(t_Rainfall_data$day1-365)

我想写一个循环。这些列称为第 1 天到第 365 天。t_Rainfall_data 将是转置矩阵。主要目的是获得总共 365 个单个 1x20 向量。

我尝试了几种方法,但都失败了。

【问题讨论】:

  • 您不需要转置似乎是data.frame,而不是matrix。试试lapply(seq_len(nrow(Rainfall_data)), function(i) Rainfall_data[i, ])。这将产生一个list 的向量。
  • 您无需将数据从数据框中切出即可进行下一步分析。告诉我们下一步是什么,我们将向您展示如何在不复制/粘贴/编辑代码的情况下轻松完成。循环遍历数据框或矩阵的行/列很容易。很难循环遍历环境中的单个对象。
  • 有什么特别的原因让您觉得需要获取一个非常有用的数据框并将其分割成这么多孤立的对象吗?
  • 保持原样可能是一个更好的主意。查看hydroTSMopenair 包。它们对时间序列数据有很多有用的功能

标签: r loops slice


【解决方案1】:

cmets 是对的:您想对向量 day1 执行的任何操作都可以使用 t_Rainfall_data$day1(或可能使用 Rainfall_data[1,])来完成,最好在执行时对数据框进行切片用它做一些事情,而不是从中创建很多冗余向量。同样,即使您需要一堆对象,处理对象列表几乎总是比创建单独的命名对象更容易。说了这么多,这里是如何获得你想要的东西:

与在 cmets 中一样,您可以返回一个向量列表

lapply(seq_len(nrow(Rainfall_data)), function(i) Rainfall_data[i, ])

如果您更喜欢循环,并创建对象而不是返回列表,您可以执行类似的操作

for(i in 1:nrow(Rainfall_data){
  assign(paste0("day",i),as.vector(t_Rainfall_data[,paste0("day",i)]))
  }

assign 将创建一个以传递给它的字符串命名的对象,其中包含第二个参数。

【讨论】:

  • 不要鼓励 OP 做出错误的选择。
  • 我很明确地不鼓励在最后一段中使用它,但觉得值得回答这个问题而不是仅仅批评糟糕的风格。即使这可能是错误的方式,我认为我不能说绝对没有用例从数据框中创建一堆向量不是最好的解决方案(例如,你正在处理别人写得不好的代码,它需要一堆命名对象,而你没有时间重写它)。以鼓励良好选择的名义,我将颠倒结构,将警告放在首位。
  • 如果您坚持回答,我建议在矩阵行上演示一个简单的循环(即使没有填充主体),并将其与使用 pasteget 的循环进行比较以显示这如何使下一步复杂化。就个人而言,我也更喜欢split(Rainfall_data, seq_len(nrow(Rainfall_data))) 而不是lapply
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2011-09-26
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多