фильтровать список разделов - PullRequest
0 голосов
/ 12 ноября 2018

Я бы отфильтровал список следующим образом: [1] (33,7)(4)(5)(6)(8), где вернуть true или false, если в элементе присутствует один и тот же элемент дважды, например:

(33,7)(4)(5)(33)FALSE
(33,33)(4)(5)(6) FALSE

но элемент, где элемент рядом в позиции 2 и 3, 4 и 5, или 6 и 7, который дважды повторяется, возвращает TRUE, но если список состоит из 7 элементов, например, последние два элемента должны отличаться, например:

(33,1)(7)(7)(6)  TRUE
(33,1)(7)(6)(5)(5)(9) TRUE
(33,1)(7)(6)(6)  FALSE
(33,1)(1)(9)(6)(7)  FALSE
(33,1)(9)(9)(6)(1)  FALSE

1 Ответ

0 голосов
/ 12 ноября 2018

Как указано в комментариях, до сих пор неясно, какая структура данных находится под рукой.Тем не менее, это может помочь:

# creating a dummy example
lst <- list()
lst[[1]] <- c(33,33)
lst[[2]] <- c(7)
lst[[3]] <- c(4)
lst[[4]] <- c(6)
lst[[5]] <- c(6)
lst[[6]] <- c(1)

# with str(lst) giving:
List of 6
 $ : num [1:2] 33 33
 $ : num 7
 $ : num 4
 $ : num 6
 $ : num 6
 $ : num 1

Теперь мы используем функцию unique, которая удаляет дубликаты, и str(unique(lst)) дает:

List of 5
 $ : num [1:2] 33 33
 $ : num 7
 $ : num 4
 $ : num 6
 $ : num 1

Так что теперь простое сравнение будетсделать трюк, например,

length(lst) == length(unique(lst))
# yielding
[1] FALSE

А теперь пример, где есть несколько таких списков:

# creating the example
lst <- lst1 <- lst2 <- list()
# list 1
lst1[[1]] <- c(33,33)
lst1[[2]] <- c(7)
lst1[[3]] <- c(4)
lst1[[4]] <- c(6)
lst1[[5]] <- c(6)
lst1[[6]] <- c(1)
# list 2
lst2[[1]] <- c(33,33)
lst2[[2]] <- c(7)
lst2[[3]] <- c(4)
lst2[[4]] <- c(5)
lst2[[5]] <- c(6)
lst2[[6]] <- c(1)
# lst is a list of two lists
lst <- list(lst1,lst2)

# testing for duplicates
vapply(1:length(lst), 
       function(k) length(lst[[k]]) == length(unique(lst[[k]])),
       logical(1))

# output
[1] FALSE  TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...