Замена значений в элементах списка - PullRequest
0 голосов
/ 22 октября 2018

У меня есть два следующих списка:

list1 <- list(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1), c(1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0), c(0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1))
list2 <- list(c(9, 10, 11, 12, 13), c(5, 6, 7, 8, 9, 10, 11, 12, 13), c(1, 2, 3, 8, 9, 10, 11, 12, 13))

list2 представляет позиции в list1, которые я хотел бы преобразовать в 0.Другими словами, я хотел бы, чтобы 9-е, 10-е, 11-е, 12-е и 13-е значения в первом элементе list1 были 0;Я бы хотел, чтобы значения с 5 по 13 во втором элементе list1 были 0;и т. д. Полученный список должен быть следующим:

list3 <- list(c(1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0), c(1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0), c(0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0))

Как я могу это сделать?Спасибо!

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Вот быстрый и грязный метод с использованием цикла for:

for(i in 1:length(list1)){
  list1[[i]][list2[[i]]]<-0
}

Я уверен, что кто-то может улучшить это, используя lapply или функцию из purrr.

0 голосов
/ 22 октября 2018

Используя простой цикл в базе R,

for(i in 1:length(list1)) {
   list1[[i]][list2[[i]]] <- 0
}

> list1
[[1]]
 [1] 1 1 1 1 1 1 1 1 0 0 0 0 0

[[2]]
 [1] 1 1 1 1 0 0 0 0 0 0 0 0 0

[[3]]
 [1] 0 0 0 1 1 1 1 0 0 0 0 0 0

Вы также можете сделать это с mapply(), как показано ниже, с SIMPLIFY=F, заставляющим функцию возвращаться в виде списка.

funfun <- function(x, y, recode=0) {
   x[y] <- recode
   return(x)
}

mapply(list1, list2, FUN=funfun, SIMPLIFY=F)
[[1]]
 [1] 1 1 1 1 1 1 1 1 0 0 0 0 0

[[2]]
 [1] 1 1 1 1 0 0 0 0 0 0 0 0 0

[[3]]
 [1] 0 0 0 1 1 1 1 0 0 0 0 0 0
0 голосов
/ 22 октября 2018

Мы можем сделать это с помощью purrr::map2 из tidyverse:

list1 <- list(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1), c(1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0), c(0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1))
list2 <- list(c(9, 10, 11, 12, 13), c(5, 6, 7, 8, 9, 10, 11, 12, 13), c(1, 2, 3, 8, 9, 10, 11, 12, 13))

library(purrr)
map2(
  .x = list1,
  .y = list2,
  .f = function(list, indexes){
    list[indexes] <- 0
    list
  }
)
#> [[1]]
#>  [1] 1 1 1 1 1 1 1 1 0 0 0 0 0
#> 
#> [[2]]
#>  [1] 1 1 1 1 0 0 0 0 0 0 0 0 0
#> 
#> [[3]]
#>  [1] 0 0 0 1 1 1 1 0 0 0 0 0 0

, созданного в 2018-10-22 пакетом представлением (v0.2.0).

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