Re: [問題] 比對兩個list

作者: celestialgod (天)   2015-11-06 00:00:27
※ 引述《angela79979 (mini)》之銘言:
: [問題敘述]:
: 有兩個list : a.list , b.list
: >head(a.list)
: $'1'
: [1] 3 4 5 8 15
: $'3'
: [1] 2 3 6 9 12 14
: ...
: >head(b.list)
: $'2'
: [1] 2 3 5 13 24
: $'1'
: [1] 2 3 5 6 7 8 9 12
: ...
: 想比較a.list和b.list中 相同編號的list的重複element個數
: 例如:
: similarity<-sum(table(a.list$'1'[a.list$'1' %in% b.list$'1']))
: 欲對每一個編號的list都作去最比對
: 但使用loop卻沒辦法對a.list$'i' 或 b.list$'i'作迴圈
: 想請問有沒有其他的方法
## data generating - assume no duplicated names and element
library(magrittr)
list_1 = replicate(50, rbinom(1, 15, .5) %>% sample(1:20, .) %>%
sort, simplify = FALSE) %>%
set_names(sample(1:50, 50) %>% as.character)
list_2 = replicate(50, rbinom(1, 15, .5) %>% sample(1:20, .) %>%
sort, simplify = FALSE) %>%
set_names(sample(1:50, 50) %>% as.character)
## method 1 - using for
intersectNames = intersect(names(list_1), names(list_2)) %>% sort
similarity = vector('numeric', length(intersectNames)) %>%
set_names(as.character(intersectNames))
for (i in seq_along(intersectNames))
similarity[i] = sum(list_1[[intersectNames[i]]] %in%
list_2[[intersectNames[i]]])
print(head(similarity))
# 1 10 11 12 13 14
# 1 2 4 1 3 1
## method 2 - using map2 (or mapply)
library(purrr)
intersectNames = intersect(names(list_1), names(list_2)) %>% sort
similarity = map2(list_1[intersectNames], list_2[intersectNames],
~ sum(.x %in% .y)) %>% do.call(c, .) %>% set_names(intersectNames)
print(head(similarity))
# 1 10 11 12 13 14
# 1 2 4 1 3 1
PS: 其實map2就是mapply... 只是
function(x,y) sum(x %in% y)
改成
~ sum(.x %in% .y)
作者: cywhale (cywhale)   2015-11-10 12:38:00
method 2~~筆記..

Links booklink

Contact Us: admin [ a t ] ucptt.com