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