首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在向量中出现特定事件后替换特定数量的值

在向量中出现特定事件后替换特定数量的值
EN

Stack Overflow用户
提问于 2017-01-19 20:20:22
回答 3查看 47关注 0票数 0

玩具模型在这里。这些数据代表了个人在一年中患上疾病的日子,例如伤风。这个向量是使用每日概率和rbinom函数生成的。例如,如果一个人得了只持续一天的伤风,他们可能在伤风后的第二天有额外的两天免疫力,所以我的问题是如何转换这种形式的向量,其中我在原始的冷天上增加了两天的“免疫力(= 1)”。

更改此设置:

代码语言:javascript
复制
0010001000001001

要这样做:

代码语言:javascript
复制
0011101110001111

我已经看过'which‘函数,可以在原始向量中找到1的索引,但不知道如何将每个'1’后面的两个索引替换为'1‘。我还在想,我希望新的向量与前一个向量的长度相同,即如果接近末尾的值是'1‘,则不会在末尾添加任何内容。

编辑:我已经设计了这个循环函数,它可以完成这项工作,但我希望有更优雅和更有效的解决方案。而且,如果我在我的原始向量中得到一个0,1,1序列,它将失败。有什么建议吗?

代码语言:javascript
复制
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    
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-19 21:45:52

假设你有一个向量,比如下面的s

代码语言:javascript
复制
s <- unlist(strsplit('0010001000001001', ''))
s
[1] "0" "0" "1" "0" "0" "0" "1" "0" "0" "0" "0" "0" "1" "0" "0" "1"

您可以使用dplyr lag函数,如下所示:

代码语言:javascript
复制
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。希望这能满足您的需求。

代码语言:javascript
复制
index <- unique(unlist(lapply(which(s == '1'),
                       function(x) {
                         index <- x:(x + 80); index <- index[index < length(s)]
                         })))
s[index] <- '1'
票数 2
EN

Stack Overflow用户

发布于 2017-01-19 20:23:50

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

代码语言:javascript
复制
gsub("(?<=1).{2}", "11", str1, perl = TRUE)
#[1] "0011101110001111"

数据

代码语言:javascript
复制
str1 <- "0010001000001001"
票数 1
EN

Stack Overflow用户

发布于 2017-01-19 21:50:46

我更喜欢使用向量,而不是存储在字符串中的数据。

代码语言:javascript
复制
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函数也是一个很好的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41741685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档