玩具模型在这里。该数据表示个人获得医疗状况的一年中的天数,例如感冒。该向量是使用每日概率和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
答案 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
函数也是一个很好的解决方案。