基于i的值将每个i重新编码为向量中的i + 1个索引项

时间:2012-08-01 23:39:55

标签: r indexing plyr

我正在尝试设计一种方法来重新编码向量中的项目,具体取决于它们是否在该向量中的某个值之后发生。我有一个完整的数据集(按主题分组的时间序列),其中包含一个列,表示受试者的初始暴露月份(此栏目的NA为缺乏暴露,“G”表示月份暴露发生)。一旦受试者被“暴露”,我需要该受试者的载体以表明他/她已经暴露直到该受试者的观察期结束。这是一个精简的示例和解决方案,但不是在每种情况下我需要它:

x2 <- c("G", NA, NA, NA, NA)
solution <- c(rep(1, length(x2)- length(rep("G", (length(x2)+1 )- which(x2=="G")))), rep("G", (length(x2)+1 )- which(x2=="G")))

在这种情况下,解决方案如下所示:

> solution
[1] "G" "G" "G" "G" "G"

也就是说,当面对不包含任何“G”的载体时,解决方案会中断

x2 <- c(NA, NA, NA, NA, NA)
solution <- c(rep(1, length(x2)- length(rep("G", (length(x2)+1 )- which(x2=="G")))), rep("G", (length(x2)+1 )- which(x2=="G")))

Error in rep("G", (length(x2) + 1) - which(x2 == "G")) : 
  invalid 'times' argument

因此,在一天结束时,解决方案向量需要: 1)与原始矢量(在这种情况下为x2)的长度相同 2)在原始矢量

中的初始“G”之后的每个位置包含值“G”

还有一件事,我需要以某种形式提供解决方案,我可以通过分组因子传递给plyr(因为我需要重新编码在大型数据集上按因子分组的许多向量)。

非常感谢大家! 克里斯

2 个答案:

答案 0 :(得分:2)

这也有效:

x2 <- c(NA,"G", NA, NA, NA, NA)
ifelse(seq_along(x2)>=match('G',x2),'G',x2)

之前已经问过这个问题......我想,我正试图挖掘旧问题。

答案 1 :(得分:0)

repG <- function(x, start) { patt <- paste0("^",start,"$")
  if( length(grep(patt, x))>0 ){ x[ grep(patt, x)[1]:length(x)] <- start
         return(x) } }
 grep("^G$", tvec)
#[1]  6  7  8  9 10 11 12