【问题标题】:How can I loop a data matrix in R?如何在 R 中循环数据矩阵?
【发布时间】:2013-02-02 19:30:03
【问题描述】:

我正在尝试为每个单独的 ID 标签“1”、“2”和“3”循环一个数据矩阵(请参阅底部的数据)。最终,我这样做是为了使用 ts() 函数将 X 和 Y 坐标转换为时间序列,但首先我需要在函数中构建一个循环,该函数为每个单独的 ID 返回一个时间序列。当我对数据框使用以下代码时,循环本身工作得很好:

for(i in 1:3){ print(na.omit(xyframe[ID==i,])) }

返回以下输出:

 Timestamp X Y ID  
 1. 0 -34.012 3.406 1  
 2. 100 -33.995 3.415 1  
 3. 200 -33.994 3.427 1

 Timestamp       X     Y ID  
 4.          0 -34.093 3.476 2  
 5.        100 -34.145 3.492 2  
 6.        200 -34.195 3.506 2  

   Timestamp       X     Y ID  
 7.         0 -34.289 3.522 3  
 8.       100 -34.300 3.520 3  
 9.       200 -34.303 3.517 3  

然而,当我想用​​相同的代码在矩阵中产生一个循环时:

for(i in 1:3){ print(na.omit(xymatrix[ID==i,]) }

它返回以下错误:

Error in print(na.omit(xymatrix[ID == i, ]) : 
  (subscript) logical subscript too long

为什么在矩阵中循环 ID 却不起作用,而它对数据帧起作用,我该如何解决? 此外,我是否读到循环需要更多的计算强度,然后基于向量做同样的事情,有没有办法基于这个向量做?

数据(真实数据的简化):

 Timestamp X Y ID  
 1.   0 -34.012 3.406 1  
 2. 100 -33.995 3.415 1  
 3. 200 -33.994 3.427 1  
 4.   0 -34.093 3.476 2  
 5. 100 -34.145 3.492 2  
 6. 200 -34.195 3.506 2  
 7.   0 -34.289 3.522 3  
 8. 100 -34.300 3.520 3  
 9. 200 -34.303 3.517 3 

【问题讨论】:

  • 您是否在其他地方声明了一个名为ID 的变量?您的代码 sn-p 没有使用数据框或矩阵中的 ID 列,而是使用另一个名为 ID 的变量。

标签: r loops matrix dataframe


【解决方案1】:

一般来说,如果你想应用一个函数到一个数据框,split通过某种因素,那么你应该使用apply系列之一与split结合使用。

这里有一些可重复的样本数据。

n <- 20  
some_data <- data.frame(
  x = sample(c(1:5, NA), n, replace= TRUE), 
  y = sample(c(letters[1:5], NA), n, replace= TRUE),
  id = gl(3, 1, length = n)
)

如果您想打印出没有缺失值的行,按每个 ID 级别拆分,那么您需要这样的东西。

lapply(split(some_data, some_data$grp), na.omit)

或更简洁地使用plyr 包。

library(plyr)
dlply(some_data, .(grp), na.omit)

这两种方法都返回这样的输出

# $`1`
   # x y grp
# 1  2 d   1
# 4  3 e   1
# 7  3 c   1
# 10 4 a   1
# 13 2 e   1
# 16 3 a   1
# 19 1 d   1

# $`2`
  # x y grp
# 2 1 e   2
# 5 3 e   2
# 8 3 b   2

# $`3`
   # x y grp
# 6  3 c   3
# 9  5 a   3
# 12 2 c   3
# 15 2 d   3
# 18 4 a   3

【讨论】:

  • 对于每个对您有帮助的答案,点击左侧分数旁边的向上箭头进行投票。
  • 非常清楚和有帮助,但是,这些方法仅适用于数据帧而不适用于矩阵,为什么会这样以及如何将相同的方法应用于矩阵?非常感谢!
  • 您可以使用 apply(data, 1, your_function) 将函数逐行应用于数据框。
  • split 不支持矩阵,因为要拆分这是一件非常不寻常的事情。将您的矩阵转换为带有as.data.frame 的数据框。
【解决方案2】:

xymatrix[ID==i,] 格式不适用于矩阵。试试这个方法:

for(i in 1:3){ print(na.omit(xymatrix[xymatrix[,'ID'] == i,])) }

【讨论】:

  • 让我们澄清一下:xymatrix[ID == i,] 也不适用于 data.frames。除非 OP 在他的环境中有一个 ID 变量,这显然是 1) 没有得到 data.frame 错误和 2) 使用矩阵时没有得到正确的错误消息 (object 'ID' not found) 的情况。 OP 的代码出错的唯一原因是他的矩阵和ID 变量的维度不兼容。
  • 没错,我在考虑 data$variable 调用。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-05-24
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2014-10-02
相关资源
最近更新 更多