You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环删除行遇问题:如何清理3秒内重复按键的重复测量数据?

清理重复测量记录:移除3秒内重复按键的行

我需要清理数据文件中的重复测量记录,需求为移除参与者3秒内多次按下空格键的对应行。我编写了如下循环代码,但它无法清除所有目标记录,还因行数动态变化报错,请问如何修改该循环以实现需求?

df_window_rem <- df_window
for (i in 2:nrow(df_window_rem)) {
  p <- df_window_rem[[i,3]] ##cell with time people presses
  q <- df_window_rem[[i-1,3]] ##cell with the previous click
  x <- df_window_rem[[i,4]] ##score 0/1 for this cell
  y <- df_window_rem[[i-1,4]] ##score 0/1 for previous cell
  if((p-q)<3){
    if (x == 1 & y == 0) {
      df_window_rem <- df_window_rem[-(i-1)]
    } else if (x == 0 & y == 1){
      df_window_rem <- df_window_rem[-i]
    } else if (x == 1 & y == 1) {
       df_window_rem<- df_window_rem[-i]
    }
  }
}

问题根源

循环失效并报错的核心原因:

  • 初始迭代范围2:nrow(df_window_rem)是固定值,删除行后数据框行数动态减少,后续迭代的索引会超出实际行数,触发报错。
  • 正向迭代时,删除行后后续行索引前移,但循环仍按原索引推进,会跳过部分需要检查的行,导致漏删。
  • 原代码中df_window_rem[-(i-1)]写法错误,会删除整列而非指定行,正确写法应为df_window_rem[-(i-1), ]。

修改方案

方案1:反向迭代循环

从最后一行往第一行遍历,删除行不会影响未遍历的行索引,彻底避免索引越界和漏删问题:

df_window_rem <- df_window
# 从最后一行开始反向遍历
for (i in nrow(df_window_rem):2) {
  p <- df_window_rem[[i, 3]]
  q <- df_window_rem[[i-1, 3]]
  x <- df_window_rem[[i, 4]]
  y <- df_window_rem[[i-1, 4]]
  
  if ((p - q) < 3) {
    if (x == 1 & y == 0) {
      df_window_rem <- df_window_rem[-(i-1), ]
    } else if (x == 0 & y == 1) {
      df_window_rem <- df_window_rem[-i, ]
    } else if (x == 1 & y == 1) {
      df_window_rem <- df_window_rem[-i, ]
    }
  }
}

方案2:向量化标记后过滤(更高效)

优先用R的向量化逻辑,先在原始数据上标记需保留的行,最后一次性过滤,完全规避动态索引问题:

df_window_rem <- df_window

# 计算当前行与前一行的时间差,第一行设为NA
time_diff <- c(NA, diff(df_window_rem[, 3]))

# 初始化保留标记,默认全部保留
keep <- rep(TRUE, nrow(df_window_rem))

# 遍历判断并标记需删除的行
for (i in 2:nrow(df_window_rem)) {
  if (time_diff[i] < 3) {
    x <- df_window_rem[i, 4]
    y <- df_window_rem[i-1, 4]
    if (x == 1 & y == 0) {
      keep[i-1] <- FALSE
    } else if (x == 0 & y == 1) {
      keep[i] <- FALSE
    } else if (x == 1 & y == 1) {
      keep[i] <- FALSE
    }
  }
}

# 过滤保留行
df_window_rem <- df_window_rem[keep, ]

内容的提问来源于stack exchange,提问作者holholhol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:20:24