标识R数据帧列上的数字或字符序列 mydf
使用标识R数据帧列上的数字或字符序列 mydf,r,dataframe,dplyr,tidyr,zoo,R,Dataframe,Dplyr,Tidyr,Zoo,使用tidyverse的解决方案 mydf <- tibble::tribble( ~seq, ~flag, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 7, 1, 1, 1, 3, 1, 2, 1, 1, 1, 1, 1, 0,
tidyverse
的解决方案
mydf <- tibble::tribble(
~seq, ~flag,
0, 0,
0, 0,
0, 0,
1, 1,
1, 1,
7, 1,
1, 1,
3, 1,
2, 1,
1, 1,
1, 1,
0, 1,
0, 1,
0, 0,
0, 0,
1, 1,
1, 1,
7, 1,
1, 1,
3, 1,
2, 1,
1, 1,
1, 1,
0, 1,
0, 1,
0, 0,
0, 0,
2, 0
)
库(tidyverse)
st不是完全重复的,但请看一看。可能将seq列视为一个字符串粘贴(mydf$seq,collapse=“,”
),然后使用grep?假设seq
是一个单位数列。@zx8754很好。我的解决方案只能用于一位数列。欢迎使用更高级或更通用的方法。@zx8754一种方法是使用str_pad
添加前导0
,如果同时存在单位或双位(或更多)数字,然后应用相同的策略,但这取决于OP是否需要它。如果是这样的话,我欢迎OP发布另一个例子,我会在有时间的时候更新我的帖子。我在评论中有一个类似的解决方案,collapse=“,”
,因此评论为“警告”。同意OP需要澄清输入。干得好!以前没有听说过rollappy()
。
library(tidyverse)
st <- str_c(mydf$seq, collapse = "")
pos <- str_locate_all(st, "1171321100")
index <- map2(pos[[1]][, 1], pos[[1]][, 2], `:`) %>% unlist()
mydf2 <- mydf %>%
mutate(Result = as.integer(row_number() %in% index))
mydf2
# # A tibble: 28 x 3
# seq flag Result
# <dbl> <dbl> <int>
# 1 0 0 0
# 2 0 0 0
# 3 0 0 0
# 4 1 1 1
# 5 1 1 1
# 6 7 1 1
# 7 1 1 1
# 8 3 1 1
# 9 2 1 1
# 10 1 1 1
# # ... with 18 more rows
library(zoo)
match_seq <- c(1, 1, 7, 1, 3, 2, 1, 1, 0, 0)
is_start <- rollapply(mydf$seq, length(match_seq), function(x) all(x == match_seq))
inds <- sapply(which(is_start), `+`, seq_along(match_seq) - 1)
mydf$flag2 <- as.numeric(1:nrow(mydf) %in% inds)
# seq flag flag2
# 1 0 0 0
# 2 0 0 0
# 3 0 0 0
# 4 1 1 1
# 5 1 1 1
# 6 7 1 1
# 7 1 1 1
# 8 3 1 1
# 9 2 1 1
# 10 1 1 1
# 11 1 1 1
# 12 0 1 1
# 13 0 1 1
# 14 0 0 0
# 15 0 0 0
# 16 1 1 1
# 17 1 1 1
# 18 7 1 1
# 19 1 1 1
# 20 3 1 1
# 21 2 1 1
# 22 1 1 1
# 23 1 1 1
# 24 0 1 1
# 25 0 1 1
# 26 0 0 0
# 27 0 0 0
# 28 2 0 0
subseqs <-
sapply(seq(0, nrow(mydf) - length(match_seq)),
function(i) mydf$seq[i + seq_along(match_seq)])
is_start <- colMeans(subseqs == match_seq) == 1