我有以下两个列表:
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
表示我想要转换为0
的list1
中的位置。换句话说,我希望list1
的第一个元素中的第9、10、11、12和13个值为0
;我希望list1
的第二个元素中的第5到13个值为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))
我该怎么做呢?谢谢!
发布于 2018-10-23 02:32:04
我们可以使用tidyverse
中的purrr::map2
实现这一点
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于2018-10-22创建(v0.2.0)。
发布于 2018-10-23 02:32:10
下面是一个使用for
循环的快速而肮脏的方法:
for(i in 1:length(list1)){
list1[[i]][list2[[i]]]<-0
}
我相信有人可以使用lapply或purrr中的函数来改进这一点。
发布于 2018-10-23 02:33:09
在基数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
https://stackoverflow.com/questions/52935557
复制相似问题