替换列表元素中的值

时间:2018-10-22 18:25:20

标签: r

我有以下两个列表:

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的{​​{1}}中的位置。换句话说,我希望0的第一个元素中的第9个,第10个,第11个,第12个和第13个值为list1;我希望0的第二个元素中的第5到第13个值为list1;等等。结果列表应该如下:

0

我该怎么做?谢谢!

3 个答案:

答案 0 :(得分:2)

我们可以使用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

reprex package(v0.2.0)于2018-10-22创建。

答案 1 :(得分:2)

这是使用for循环的一种快速而肮脏的方法:

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

我确信有人可以使用lapply或purrr中的函数对此进行改进。

答案 2 :(得分:1)

在基数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