Вернуть имена - PullRequest
       17

Вернуть имена

0 голосов
/ 01 июня 2018

У меня есть df, похожий на это:

Я хочу получить все имена, которые имеют по крайней мере 2 последовательных появления 1. 1. 1003 *

В этом случае я хочу вернуться толькоBCD F.

Есть ли способ сделать это?

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Используя lag, это подходит только для последовательных 2, если вам нужно увеличить лимит, вы можете проверить ответ Акруна

s=df$Name[apply(df[,c(2:6)],1,function(x) any((lag(x)==x)&x==1))]
s[!is.na(s)]
[1] "B" "C" "D" "F"
0 голосов
/ 01 июня 2018

Опция, использующая zoo::rollapply:

library(zoo)

#One can increase the n for 3, 4 etc consecutive values
# For consecutive 2 values
n =2
df1[apply(df1[-1], 1, function(x)
  length(which(rollapply(x, width=n, function(x)all(x==rep(1,n)), align = "left")))>0),1]

#[1] "B" "C" "D" "F"
0 голосов
/ 01 июня 2018

Мы можем циклически проходить по строкам, использовать rle (чтобы найти, есть ли последовательные элементы) и создать логический индекс для подстановки «Имен»

df1$Name[apply(df1[-1], 1, function(x) {
                 rl <- rle(x==1)
            any(rl$lengths[rl$values]>=2)})]
#[1] "B" "C" "D" "F"

Более быстрый подход можетбыть paste элементами в каждой строке, а затем использовать регулярное выражение, чтобы найти, следует ли 1 за 1

df1$Name[grepl("(?<=1)1", do.call(paste0, df1[-1]), perl = TRUE)]
#[1] "B" "C" "D" "F"

data

df1 <- structure(list(Name = c("A", "B", "C", "D", "E", "F"), `2000` = c(1L, 
0L, 1L, 1L, 0L, 0L), `2001` = c(0L, 0L, 1L, 1L, 1L, 1L), `2002` = c(0L, 
1L, 0L, 1L, 0L, 0L), `2003` = c(1L, 1L, 0L, 1L, 1L, 1L), `2004` = c(0L, 
0L, 1L, 1L, 0L, 1L), `2005` = c(1L, 1L, 1L, 0L, 1L, 1L)), .Names = c("Name", 
"2000", "2001", "2002", "2003", "2004", "2005"), class = "data.frame", 
 row.names = c(NA, -6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...