замените логические элементы в списке на основе другого логического списка в R

#r #list #function #nested-loops

Вопрос:

Я пытаюсь изменить логические значения (элементы) моего списка на основе другого списка. В принципе, если оба списка являются «ИСТИННЫМИ», я хочу изменить значение в основном списке на «ЛОЖЬ». Оба списка имеют длину 5. Например

 List_A <- list(c(TRUE,FALSE,TRUE),c(FALSE,TRUE,TRUE),c(FALSE,FALSE,FALSE),c(TRUE,TRUE,TRUE),c(TRUE,FALSE,TRUE))

List_B <-list(c(FALSE,FALSE,FALSE),c(TRUE,TRUE,FALSE),c(TRUE,TRUE,TRUE),c(FALSE,FALSE,TRUE),c(FALSE,TRUE,TRUE))
 

Список B содержит последовательности в качестве атрибутов имен.

Желаемый результат:

 Output <-
list(c(TRUE,FALSE,TRUE),c(FALSE,FALSE,TRUE),c(FALSE,FALSE,FALSE),c(TRUE,TRUE,FALSE),c(TRUE,FALSE,FALSE))
 

Другими словами, элементы в списке остаются неизменными, если они не имеют совпадающих истинных значений в обоих списках, что заменяет их на ЛОЖНЫЕ.
Я попытался запустить цикл for ниже, но он не работает, и я не знаю, как бы я перенаправил вывод, если бы это было так.

for(i in 1:length(List_A)) { List_A[[i]][List_B[[i]]] <- FALSE }

Комментарии:

1. Есть ли причина не превращать эти списки в матрицы? Это сделало бы ненужным использование цикла (и Map также является циклом).

2. Спасибо! Функция карты отлично работает. У меня есть нисходящая функция, которая требует, чтобы входные данные были списками, поэтому я работаю с ними так

Ответ №1:

Вы можете воспользоваться помощью Map функции.

Если оба значения имеют TRUE значение «включить FALSE » или «сохранить значение List_A «.

 Output <- Map(function(x, y) replace(x, x amp; y, FALSE), List_A, List_B)
Output
#[[1]]
#[1]  TRUE FALSE  TRUE

#[[2]]
#[1] FALSE FALSE  TRUE

#[[3]]
#[1] FALSE FALSE FALSE

#[[4]]
#[1]  TRUE  TRUE FALSE

#[[5]]
#[1]  TRUE FALSE FALSE
 

данные

 List_A <- list(c(TRUE,FALSE,TRUE),c(FALSE,TRUE,TRUE),c(FALSE,FALSE,FALSE),c(TRUE,TRUE,TRUE),c(TRUE,FALSE,TRUE))
List_B <- list(c(FALSE,FALSE,FALSE),c(TRUE,TRUE,FALSE),c(TRUE,TRUE,TRUE),c(FALSE,FALSE,TRUE),c(FALSE,TRUE,TRUE)) 
 

Комментарии:

1. Большое спасибо!!! Это сработало великолепно. Однако вывод не так точен, как хотелось бы. Я хочу, чтобы элементы с TRUE в обоих списках были заменены на FALSE. Если совпадение «ЛОЖНОЕ», я бы хотел, чтобы оно оставалось ЛОЖНЫМ. Как я могу это сделать? Я обновил вопрос, чтобы показать желаемый результат

Ответ №2:

Мы можем использовать map2

 library(purrr)
map2(List_A, List_B, ~ !(.x amp; .y))
 

данные

 List_A <- list(c(TRUE,FALSE,TRUE),c(FALSE,TRUE,TRUE),c(FALSE,FALSE,FALSE),c(TRUE,TRUE,TRUE),c(TRUE,FALSE,TRUE))
List_B <- list(c(FALSE,FALSE,FALSE),c(TRUE,TRUE,FALSE),c(TRUE,TRUE,TRUE),c(FALSE,FALSE,TRUE),c(FALSE,TRUE,TRUE)) 
 

Комментарии:

1. Спасибо вам за это. Если я хочу только изменить соответствующие ИСТИННЫЕ значения на ЛОЖНЫЕ, а остальные оставить такими, какие они есть в списке, как я могу настроить код?

2. @user15520242 в таком случае просто сделайте map2(List_A, List_B, amp; ) amp; внутренние обратные цитаты

3. На самом деле это все равно дает тот же результат , ~ !(.x amp; .y) что и, за исключением того, что общее количество значений TRUE было заменено на FALSE. Однако, если я заменю его функцией из @ronak выше, то это даст ожидаемый результат. Спасибо вам, несмотря ни на что!