#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 выше, то это даст ожидаемый результат. Спасибо вам, несмотря ни на что!