问题中的数据看起来很奇怪,所以我们使用了最后 Note 中的数据。如果您确实有一个值为“TRUE”和“FALSE”的字符向量或因子,则可以使用以下方法轻松地将其转换为逻辑:
df <- transform(df, history = history == "TRUE")
1) rollapply 首先定义模式,然后使用带有rollapplyr 的移动窗口搜索它。这给出了一个逻辑向量,如果它是这种模式匹配的结尾,则该向量为 TRUE。找到 TRUE 的索引并包括前两个索引。最后执行子集。
library(zoo)
pattern <- c(TRUE, FALSE, TRUE)
ix <- which(rollapplyr(df$history, length(pattern), identical, pattern, fill = FALSE))
ix <- unique(sort(c(outer(ix, seq_along(pattern) - 1L, "-"))))
df[ix, ]
给予:
value history
1 0.062500000 TRUE
2 0.031250000 FALSE
3 0.020833333 TRUE
4 0.015625000 TRUE
5 0.012500000 FALSE
6 0.010416667 TRUE
8 0.007812500 TRUE
9 0.006944444 FALSE
10 0.006250000 TRUE
1a) magrittr (1)中的这段代码可以用 magrittr 来表示。 (解决方案(2)也可以按照类似的想法使用 magrittr 来表达。)
library(magrittr)
library(zoo)
df %>%
extract(
extract(.,, "history") %>%
rollapplyr(length(pattern), identical, pattern, fill = FALSE) %>%
which %>%
outer(seq_along(pattern) - 1L, "-") %>%
sort %>%
unique, )
2) gregexpr 使用上面定义的pattern,我们将其转换为0 和1 的字符串,并将df$history 转换为这样的字符串。然后我们可以使用 gregexpr 查找每个匹配项的第一个元素的索引,然后将其扩展到所有索引和子集。我们得到和以前一样的答案。此替代方案不使用任何包。
collapse <- function(x) paste0(x + 0, collapse = "")
ix <- gregexpr(collapse(pattern), collapse(df$history))[[1]]
ix <- unique(sort(c(outer(ix, seq_along(pattern) - 1L, "+"))))
df[ix, ]
注意
Lines <- "
value history
1 0.062500000 TRUE
2 0.031250000 FALSE
3 0.020833333 TRUE
4 0.015625000 TRUE
5 0.012500000 FALSE
6 0.010416667 TRUE
7 0.008928571 TRUE
8 0.007812500 TRUE
9 0.006944444 FALSE
10 0.006250000 TRUE"
df <- read.table(text = Lines)