在向量

时间:2017-01-19 12:20:22

标签: r vector indexing

玩具模型在这里。该数据表示个人获得医疗状况的一年中的天数,例如感冒。该向量是使用每日概率和rbinom函数生成的。例如,如果一个人感冒只持续一天,他们可能在感冒后的一天有两天额外的免疫力,所以我的问题是如何转换这种形式的矢量,我又增加了两天“免疫力(= 1)至原始寒冷的一天。

改变这个:

0010001000001001

到此:

0011101110001111

我已经看过'which'函数,可以在原始向量中找到1的索引,但不知道如何在每个'1'之后用'1'替换这两个索引。我也在想我希望新向量与前一个长度相同,即如果接近结尾的值为'1'则不会添加到结尾。

编辑: 我已经设计了这个循环功能,它完成了这项工作,但我希望有更多优雅和高效的解决方案。此外,如果我在原始矢量中得到0,1,1序列,它将失败。有什么建议吗?

rm(list=ls())
library(zoo)
DayNonSup <- 80
VecLen <- 345
stuff1 <- rep(0,VecLen)
stuff1[c(15,35,335)] <- 1

convert <- function (vector, d) {
    for (i in 1:100) {
        a <-  which(rollapply(vector, 3, identical, c(0,1,0)))[1] + 1
        if(is.na(a)) {break}
        vector[a:(a+d)] <- 1
    }
    vector
}
stuff2 <- convert(stuff1,DayNonSup)[1:VecLen]
stuff2    

3 个答案:

答案 0 :(得分:2)

假设你有一个像s下面的矢量:

s <- unlist(strsplit('0010001000001001', ''))
s
[1] "0" "0" "1" "0" "0" "0" "1" "0" "0" "0" "0" "0" "1" "0" "0" "1"

您可以使用dplyr滞后功能,如下所示:

s[lag(s) == '1' | lag(s, n = 2) == '1'] <- '1'
s
[1] "0" "0" "1" "1" "1" "0" "1" "1" "1" "0" "0" "0" "1" "1" "1" "1"

如果您的值向量是数字0/1,则可以调整此解析。只需将'1'替换为1

编辑:根据下面的新要求,我建议使用这样的东西。你找出哪个原始字符串位置有1个。然后,获得超过80个指数的列表。减少整个过程以确保选择的索引保持在原始字符串的长度内。使用这些索引的唯一替换1。希望这符合你的需要。

index <- unique(unlist(lapply(which(s == '1'),
                       function(x) {
                         index <- x:(x + 80); index <- index[index < length(s)]
                         })))
s[index] <- '1'

答案 1 :(得分:1)

如果这是一个字符串,我们可以使用gsub。我们使用正则表达式查找匹配1后跟两个数字.{2}并将其替换为两个1&#39>

gsub("(?<=1).{2}", "11", str1, perl = TRUE)
#[1] "0011101110001111"

数据

str1 <- "0010001000001001"

答案 2 :(得分:0)

我更喜欢使用矢量作为存储在字符串中的数据。

str1 <- '0010001000001001'
vec <- unlist(strsplit(str1, ''))
df <- data.frame(day = vec,
                 daymin1 = c(0,vec[1:(length(vec)-1)]),
                 daymin2 = c(0,0,vec[1:(length(vec)-2)]))
apply(df,1,max)

这是base。另一个答案中提到的dplyr::lag函数也是一个很好的解决方案。