這可以以一個簡單的在一個lapply
線
lapply(diff(c(0, which(x))), function(x) c(rep(FALSE, (x-1)), TRUE))
#[[1]]
#[1] FALSE FALSE FALSE TRUE
#[[2]]
#[1] FALSE FALSE TRUE
#[[3]]
#[1] FALSE FALSE FALSE TRUE
#[[4]]
#[1] FALSE TRUE
說明
which(x)
給我們的TRUE
值(4, 7, 11, 13
)
- 從0開始的位置來完成,我們希望每個TRUE(其實質上是
FALSE
的計數) - diff(c(0, which(x)))
- 4 3 4 2
- 對於每一個我們需要一個載體,其是
length(x)
這些價值觀,與x - 1
FALSE
值,並1
TRUE
- c(rep(FALSE, (x-1)), TRUE)
- 的
lapply
這是否爲每個4 3 4 2
值,並返回一個列表
標杆
比較方案
library(microbenchmark)
splitAt <- function(x, pos) unname(split(x, cumsum(seq_along(x) %in% pos)))
microbenchmark(
splitAt(x, which(x)+1),
{r <- rle(x)$lengths
lapply(r[seq(1,length(r), by=2)] , function(x) c(rep(FALSE, x), TRUE))},
split(x, sum(x) - rev(cumsum(rev(x)))),
trimws(strsplit(paste(x, collapse=" "), "(?<=TRUE)", perl=T)[[1]]),
lapply(diff(c(0, which(x))), function(x) c(rep(FALSE, (x-1)), TRUE))
)
# min lq mean median uq max neval
# 83.827 86.3910 91.76449 88.9155 92.8350 155.722 100
# 94.373 97.6275 105.10872 101.1455 105.8545 307.927 100
# 85.532 88.0660 93.59524 91.7935 95.3715 126.419 100
#145.233 147.8755 152.65975 150.3250 156.5910 177.807 100
# 26.451 29.6130 31.81785 31.0470 33.1895 43.267 100
數據
x <- c(F, F, F, T, F , F, T, F, F, F, T, F, T)
向我們展示你的'for'循環 – MaxPD
也'trimws(strsplit(粘貼(X,崩潰=」「), 「(?<= TRUE)」,PERL假設'x < - as.logical(x)' - 'split(x,sum(x) - rev()= T)[[1]])' –
can you explain using example ?, thankyou –