Как я могу сравнить подзначения в списке друг с другом, используя цикл for? - PullRequest
0 голосов
/ 23 января 2019

В настоящее время у меня есть список, как показано ниже. Я хотел бы разработать forloop, который просматривает каждый элемент в списке и сравнивает символы в этом списке. В предмете не может быть больше двух символов.

all = [[a, z]], [[a, a]], [[e, r]], [[p, p]] .... (более похожие элементы)]

Также записывается как:

[[1]]
[1] "a" "z"

[[2]]
[1] "a" "a"

[[3]] 
[1] "e" "r"

[[4]] 
[1] "p" p"

Я хотел бы просмотреть каждый элемент списка и проверить, совпадают ли элементы. Я хотел бы напечатать количество совпадений. Например, в этом списке я бы хотел:

[[2]]
 [1] "a" "a"

 [[4]] 
 [1] "p" p"

Так как «a» соответствует «a», а «p» соответствует «p». Я бы хотел, чтобы цикл for возвращал значение 2, считая количество совпадений.

Есть предложения?

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Использование sapply с uniqueN

lst1[sapply(lst1,data.table::uniqueN)==1]
[[1]]
[1] "a" "a"

[[2]]
[1] "p" "p"
0 голосов
/ 23 января 2019

Вот еще 3 способа:

sum((x<-unlist(lst1))[c(T,F)]==x[c(F,T)])
#[1] 2
sum(sapply(lst1,function(x) x[1] == x[2]))
#[1] 2
sum(lengths(sapply(lst1,unique))==1)
#[1] 2

И эталонный тест:

lst2 <- rep(lst1,1000)

microbenchmark::microbenchmark(
  mm1 = sum((x<-unlist(lst2))[c(T,F)]==x[c(F,T)]),
  mm2 = sum(sapply(lst2,function(x) x[1] == x[2])),
  mm3 = sum(lengths(sapply(lst2,unique))==1),
  akrun = length(Filter(function(x) length(unique(x))==1, lst2)),
  WB  = length(lst2[sapply(lst2,data.table::uniqueN)==1]),
  WB2 = length(lst2[sapply(lst2,dplyr::n_distinct)==1]),
  dd  = sum(sapply(lst2, duplicated)),
  dd2 = sum(sapply(lst2, function(x) duplicated(x)[2]))
)

# Unit: microseconds
#  expr       min        lq      mean    median        uq        max neval    cld
# mm1     146.104   156.972   284.218   160.292   164.368   9357.887   100 a     
# mm2    4141.922  4493.899  5211.921  5043.449  5550.736   8576.352   100  b    
# mm3   15911.727 17504.531 19123.916 19108.955 20324.424  26267.587   100    de 
# akrun 17991.895 19451.122 21222.071 20960.609 22765.172  29885.165   100     e 
# WB    31602.789 36288.222 39258.331 37895.967 39659.628 134526.556   100      f
# WB2   14003.624 15026.653 16783.403 15391.911 16116.695 119739.284   100   c   
# dd    14493.253 15950.668 17077.778 16792.124 17932.125  21876.323   100   cd  
# dd2   16532.970 17768.060 19172.640 18722.867 20769.075  24318.128   100    de 
0 голосов
/ 23 января 2019

Мы можем использовать Filter для фильтрации элементов list, создав логическое условие, которое проверяет length из unique элементов в каждом элементе list как 1

out <- Filter(function(x) length(unique(x))==1, lst1)
out
#[[1]]
#[1] "a" "a"

#[[2]]
#[1] "p" "p"

length(out)
#[1] 2

Или другой вариант:

sum(sapply(lst1, function(x) do.call(identical, as.list(x))))

data

lst1 <- list(c('a', 'z'), c('a', 'a'), c('e', 'r'), c('p', 'p'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...