Несколько союзов - PullRequest
       13

Несколько союзов

9 голосов
/ 01 апреля 2011

Я пытаюсь объединить несколько списков (на самом деле это объекты GRanges, а не целочисленные списки, но принцип тот же), в основном один большой союз.

x<-sort(sample(1:20, 9))
y<-sort(sample(10:30, 9))
z<-sort(sample(20:40, 9))
mylists<-c("x","y","z")
emptyList<-list()
sapply(mylists,FUN=function(x){emptyList<-union(emptyList,get(x))})

Это просто возврат содержимого списка. Мне нужен эквивалент

union(x,union(y,z))
[1]  2  3  5  6  7 10 13 15 20 14 19 21 24 27 28 29 26 31 36 39

но написано в расширяемой и не "переменной явной" форме

Ответы [ 5 ]

17 голосов
/ 01 апреля 2011

Не обязательно эффективная память, которая будет работать с GRanges:

Reduce(union, list(x, y, z))

Аргумент может также быть GRangesList(x, y, z) для соответствующих значений x и т. Д.

1 голос
/ 19 февраля 2019
x<-sort(sample(1:20, 9))
y<-sort(sample(10:30, 9))
z<-sort(sample(20:40, 9))

Оба из нижеприведенного производят одинаковый вывод

unique(c(x,y,z))
[1]  1  2  4  6  7  8 11 15 17 14 16 18 21 23 26 28 29 20 22 25 31 32 35

union(x,union(y,z))
[1]  1  2  4  6  7  8 11 15 17 14 16 18 21 23 26 28 29 20 22 25 31 32 35
1 голос
/ 01 апреля 2011

Я думаю, что было бы чище отделить часть «разыменования» от n-арной части объединения, например,

dereflist <- function(l) lapply(a,get)
nunion <- function(l) Reduce(union,l)

Но если вы посмотрите на то, как работает объединение, вы увидите, что вы могли бытакже выполните

nunion <- function(l) unique(do.call(c,l))

, что быстрее во всех случаях, которые я тестировал ( намного быстрее для длинных списков).

-s

1 голос
/ 01 апреля 2011

хорошо, это работает, но мне любопытно, почему у sapply, похоже, есть своя область действия

x<-sort(sample(1:20, 9))
y<-sort(sample(10:30, 9))
z<-sort(sample(20:40, 9))
mylists<-c("x","y","z")
emptyList<-vector()
for(f in mylists){emptyList<-union(emptyList,get(f))}
1 голос
/ 01 апреля 2011
unique(unlist(mget(mylists, globalenv())))

сделает свое дело. (Возможно, при необходимости изменив среду, указанную в вызове, на mget.)

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