如何解决R中响应变量的这种复杂的重新编码问题

如何解决R中响应变量的这种复杂的重新编码问题,r,for-loop,recode,R,For Loop,Recode,我试图重新编码一个在输入数据时编码不正确的变量。这(看起来)很棘手,我需要一些指导 数据帧(长格式)有三列:s_id(参与者标识符)i_id(项目标识符)分数(二进制--0/1--正确/不正确)。需要重新编码的是分数 该评估是这样的,对于每个参与者,项目被管理,直到6个连续的项目被错误回答(将第6个不正确的项目称为基础项目)。在这一点上,管理了14个额外的项目,14个项目之后的所有剩余项目都应该被编码为缺失。问题是14之后的所有项目都用零编码,这使得分析变得困难 我需要一个新变量n_score,

我试图重新编码一个在输入数据时编码不正确的变量。这(看起来)很棘手,我需要一些指导

数据帧(长格式)有三列:s_id(参与者标识符)i_id(项目标识符)分数(二进制--0/1--正确/不正确)。需要重新编码的是分数

该评估是这样的,对于每个参与者,项目被管理,直到6个连续的项目被错误回答(将第6个不正确的项目称为基础项目)。在这一点上,管理了14个额外的项目,14个项目之后的所有剩余项目都应该被编码为缺失。问题是14之后的所有项目都用零编码,这使得分析变得困难

我需要一个新变量n_score,通过循环每个参与者的原始分数创建,寻找连续六个0的第一个实例,然后再计算14。这些分数简单地放在n_分数中,但每个参与者的分数应该重新编码
NA

我陷入了困境,需要一些帮助——也许是解决这个问题的一个聪明方法。下面是数据结构的一个可复制示例,添加了一列(n_分数),这就是新重新编码的变量的外观

要生成数据,请执行以下操作:

s_id <- rep(c(1:2), each = 25)
i_id <- rep(1:25, 2)
score <- c(1,1,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,1,0,0,0,1,1,1,
           1,1,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,1,0,0,0,1,1,1)
n_score <- c(1,1,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,1,0,0,0,NA,NA,NA,
             1,1,0,0,0,0,0,0,1,0,1,0,0,0,1,1,0,0,1,0,0,0,NA,NA,NA)

dat <- data.frame(
  s_id = s_id,
  i_id = i_id,
  score = score,
  n_score = n_score
)

s_id在base R中有一个解决方案,它通过
s_id
分割数据;在结果数据帧的
得分中查找6个或更多零的运行;使用这些跑步终点的位置加上14将分数翻转为NA;然后将结果重新绑定到一个数据帧中

newdat <- do.call(rbind, lapply(split(dat, dat$s_id), function(i) {

    x <- rle(i$score)

    i$n_score <- ifelse(seq_along(i$score) > sum(x$lengths[1:which(x$lengths >= 6 & x$values == 0)]) + 14, NA, i$score)

    return(i)

}))

我不知道这是否有效,但以下是我的尝试:

dat$New_n_score <- NA

SixZeros <- rep(0, 6)
m <- length(SixZeros)


for(j in unique(dat$s_id)){

  score <- dat$score[dat$s_id == j]

  n <- length(score)
  ind <- seq.int(length = n - m + 1)
  pos <- rep(TRUE, times = n - m + 1)

  for (i in seq.int(length = m)) {
    pos <- pos & (SixZeros[i] == score[ind + i - 1])
  }

  n_score_stop <- which(pos) + 19 

  dat$New_n_score[dat$s_id == j][1:n_score_stop] <- dat$score[dat$s_id == j][1:n_score_stop]

}

dat$New\u n\u score此代码的输出与n\u score中的输出相同:

mypattern = '000000'
recode <- function(x) {
  start <- regexpr(mypattern, paste(x,collapse=''))
  end <- start + 6 + 14 -1
  return(c(x[1:end], rep(NA, length(x) - end)))
}

ddply(dat, .(s_id), transform, newcol=recode(score))
mypattern='000000'
重新编码
mypattern = '000000'
recode <- function(x) {
  start <- regexpr(mypattern, paste(x,collapse=''))
  end <- start + 6 + 14 -1
  return(c(x[1:end], rep(NA, length(x) - end)))
}

ddply(dat, .(s_id), transform, newcol=recode(score))