玩具模型在这里。这些数据代表了个人在一年中患上疾病的日子,例如伤风。这个向量是使用每日概率和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 发布于 2017-01-19 21:45:52
假设你有一个向量,比如下面的s:
s <- unlist(strsplit('0010001000001001', ''))
s
[1] "0" "0" "1" "0" "0" "0" "1" "0" "0" "0" "0" "0" "1" "0" "0" "1"您可以使用dplyr lag函数,如下所示:
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'发布于 2017-01-19 20:23:50
如果这是一个字符串,我们可以使用gsub。我们使用正则表达式查找来匹配后跟两个数字.{2}的1,并将其替换为两个1
gsub("(?<=1).{2}", "11", str1, perl = TRUE)
#[1] "0011101110001111"数据
str1 <- "0010001000001001"发布于 2017-01-19 21:50:46
我更喜欢使用向量,而不是存储在字符串中的数据。
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函数也是一个很好的解决方案。
https://stackoverflow.com/questions/41741685
复制相似问题