удаление и добавление элементов из и в список на основе наложения векторов - PullRequest
2 голосов
/ 07 мая 2019

У меня есть список с ~ 500 модельными объектами.Имена этих объектов v1:

existing.list <- vector("list", 3)
v1 <- names(existing.list) <- c("A", "B", "C")

Теперь я получаю другой набор данных, который мне тоже нужно смоделировать и сохранить в том же списке.Объекты в этом новом наборе данных перекрываются с некоторыми из объектов в existing.list.Поскольку это занимает много времени, я хочу сохранить старые результаты.Имена этого нового набора данных: v2:

v2 <- c("B", "C", "D")

Сначала я хочу удалить объекты в v1, которых нет в v2, а затем добавить в существующий. Список всех новых уникальных имен из v2.Я могу выполнить первое задание довольно сложным способом:

rm <- v1[!v1 %in% v2]
rm.i <- which(v1 %in% rm)
v1 <- v1[-rm.i]

Но тогда мне не удается добавить новые объекты, как определено уникальными элементами в v2:

new.elements <- v2[!v2 %in% v1]

желаемый результат - модифицированный existing.list, с неповрежденными элементами "B" и "C" и новым пустым элементом "D".По сути, это список с элементами, определяемыми именами в v2, но по ряду причин было бы сложно просто создать новый список и скопировать в него части existing.list.Поскольку мне нужно сделать это для нескольких списков, подойдет менее сложный способ, чем я делаю сейчас.

Заранее большое спасибо!Это последнее добавление к проекту, поэтому любая помощь высоко ценится!

Этот вопрос основан на предыдущем вопросе , который я небрежно сформулировал и таким образом создал путаницу.Спасибо тем пользователям, которые все еще пытались мне помочь.

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Если я вас правильно понял, вы можете сначала получить имена элементов, которые находятся в v2, но не в v1

tmp <- setdiff(v2, v1) # "D"

А затем подмножество existing.list и добавить его следующим образом

existing.list <- c(existing.list[v1 %in% v2], 
                   setNames(vector("list", length(tmp)), tmp))

Результат

existing.list
#$B
#NULL

#$C
#NULL

#$D
#NULL
1 голос
/ 07 мая 2019

Это то, что вы ищете?

intersect(v1, v2)
# [1] "B" "C"

setdiff(v2, v1)
# [1] "D"
...