【问题标题】:Sliding Windows for Rows in RR中的行滑动窗口
【发布时间】:2020-04-11 16:10:36
【问题描述】:

我有一个数据框,它有大约 50000 行,我想循环它,每个循环移动 10 行直到它到达 50000 行,这是代码。

for (i in 1:50000){

  if(df[[1]][i,8] > 1){

    hom <- hom + df[[1]][i,11]
  }else{
    het<-het + het[[1]][i,11]
  }
  score[i] = hom/(hom+het)

}

在代码中,我正在检查第 8 列中的条件是真还是假,以便应用适当的函数。 然后我得到分数。 所以我基本上想得到每行10行的分数{1-10,2-11,3-12,4-13........49990-50000}

如果你能帮忙,我会很高兴 谢谢

【问题讨论】:

  • 看来你需要library(zoo); rollsum(df[[1]], 10)
  • 能否请您展示一个可重现的小示例,因为此处的某些索引似乎不正确df[[1]][i, 8]df[[1]] 是一个向量,并且没有 dim 属性
  • @akrun,df 是一个列表,所以我选择了第一个子列表,即 df[[1]] 并且在子列表中,它有 11 列

标签: r for-loop


【解决方案1】:

以下代码实现了一个 R 函数,该函数接收一个向量和一个表示任意大小的滑动窗口的整数作为输入。该函数输出一个向量,其中包含窗口每个缩管内元素的平均值(您可以调整代码以进行任何其他类型的计算)。

# Function that computes an sliding window based on the mean values
compute_mean_feat <- function(vector, window) {
  mean <- c()
  for (i in 1:length(vector)) {
    if (i <= window) {
      sum <- 0
      for (k in 1:i) {
        sum  <- vector[k] + sum
      }
      mean <- c(mean, as.numeric(sum / i))
    } else{
      sum <- 0
      for (j in (i - window + 1):i) 
        sum  <- vector[j] + sum
      }
      mean <- c(mean, as.numeric(sum / i))
    }
  }
  return(mean)
}

您可以看到将滑动窗口为 10 的 compute_mean_feat 函数应用于虚拟 vector 的结果。

# Manual example for testing
window <- 10    
vector <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
compute_mean_feat(vector, window)

对于数据框,您只需将此函数应用于所需的列,它将为您提供其行的滑动窗口向量。

【讨论】:

  • 非常感谢,它有效,但是,每当我使用它遍历超过 150,000 行时,它似乎有点慢。非常感谢,它就像 runmean 一样工作,因为我希望它工作
猜你喜欢
  • 2013-04-03
  • 2012-07-25
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 2019-02-09
相关资源
最近更新 更多