Как объединить два списка на основе индексов объектов - сохранение атрибутов? - PullRequest
7 голосов
/ 30 января 2020

Я хочу объединить два списка, сохраняя индекс каждого объекта:

mylist<-list(1,NULL,2)
otherlist<-list(NULL,3,NULL,4,5,6)

# Desired

list(1,3,2,4,5,6)

# my try:

suppressWarnings(mapply(c, mylist, otherlist) )

Ответ должен быть универсальным

РЕДАКТИРОВАТЬ: во избежание распространения подобных вопросов. Я решил запросить здесь также возможность сохранения атрибутов (желательно с базой).

mylist<-list(1,NULL,2)
attr(mylist[[1]],"at")<-"a"
attr(mylist[[3]],"at")<-"c"

otherlist<-list(NULL,3,NULL,4,5,6)

attr(otherlist[[2]],"at")<-"b"
attr(otherlist[[4]],"at")<-"d"
attr(otherlist[[5]],"at")<-"e"
attr(otherlist[[6]],"at")<-"f"

Ответы [ 2 ]

1 голос
/ 14 февраля 2020
foo <- function(l1, l2) {
  out <- vector(mode = "list", length = max(length(l1), length(l2)))
  out[seq_along(l1)] <- l1
  out[!lengths(out)] <- l2[!lengths(out)]
  out
}

foo(mylist, otherlist2)

# [[1]]
# [1] 1
# attr(,"at")
# [1] "a"
# 
# [[2]]
# [1] 3
# attr(,"at")
# [1] "b"
# 
# [[3]]
# [1] 2
# attr(,"at")
# [1] "c"
# 
# [[4]]
# [1] 5
# attr(,"at")
# [1] "e"
# 
# [[5]]
# [1] 6
# attr(,"at")
# [1] "f"
1 голос
/ 30 января 2020

Здесь есть опция, где мы создаем логический индекс с lengths (который будет возвращать 0, когда есть NULL) и используем для присвоения элементов с mylist в списке

otherlist[lengths(otherlist) == 0] <- unlist(mylist)
otherlist
#[[1]]
#[1] 1

#[[2]]
#[1] 2

#[[3]]
#[1] 3

#[[4]]
#[1] 4

#[[5]]
#[1] 5

#[[6]]
#[1] 6

Если нам нужно использовать Map, убедитесь, что lengths одинаковы для соответствующих элементов

otherlist[seq_along(mylist)] <- Map(c, otherlist[seq_along(mylist)], mylist)

Update

Для обновленного примера

i1 <- sapply(otherlist, is.null)
i2 <- !sapply(mylist, is.null)
otherlist[i1] <- mylist[i2]

otherlist
#[[1]]
#[1] 1
#attr(,"at")
#[1] "a"

#[[2]]
#[1] 3
#attr(,"at")
#[1] "b"

#[[3]]
#[1] 2
#attr(,"at")
#[1] "c"

#[[4]]
#[1] 4
#attr(,"at")
#[1] "d"

#[[5]]
#[1] 5
#attr(,"at")
#[1] "e"

#[[6]]
#[1] 6
#attr(,"at")
#[1] "f"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...