运行Map可减少矩阵的尺寸

时间:2015-03-15 21:56:30

标签: r matrix

说我有三个清单:

 l_zero
[[1]]
     [,1] [,2]
[1,]    0    0
[2,]    0    0

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

l_ind <- list(matrix(c(1,1), ncol = 2), matrix(c(1,1,1,2), ncol = 2))
l_ind
[[1]]
     [,1] [,2]
[1,]    1    1

[[2]]
     [,1] [,2]
[1,]    1    1
[2,]    1    2

l_val <- list(5, c(4, 7))
l_val
[[1]]
[1] 5

[[2]]
[1] 4 7

我想在三个列表上运行Map,目标是使用l_zero中的l_ind中的坐标替换l_val中的坐标。 我的尝试给了我以下内容:

Map(function(l_zero, l_ind, l_val) l_zero[l_ind] <- l_val, l_zero = l_zero, l_ind = l_ind, l_val = l_val)
[[1]]
[1] 5

[[2]]
[1] 4 7

正如您所看到的,矩阵的原始尺寸减小了,但我想保留矩阵的尺寸,只需用l_ind中的坐标替换这些值。我试过了l_zero[l_ind, drop = FALSE],但这也没有帮助。

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:4)

这里有一个更简单的方法,[<-替换函数可用于Map()函数参数。它按顺序需要三个参数。

Map("[<-", l_zero, l_ind, l_val)
# [[1]]
#      [,1] [,2]
# [1,]    5    0
# [2,]    0    0
# 
# [[2]]
#      [,1] [,2]
# [1,]    4    7
# [2,]    0    0

答案 1 :(得分:1)

您需要从映射函数返回修改后的值(请参阅下面的return(l_zero))。

l_zero <- replicate(2,matrix(0,2,2),simplify=FALSE)
l_ind <- list(matrix(c(1,1), ncol = 2), matrix(c(1,1,1,2), ncol = 2))
l_val <- list(5, c(4, 7))

ff <- function(l_zero, l_ind, l_val) {
    l_zero[l_ind] <- l_val
    return(l_zero)
}
Map(ff, l_zero = l_zero, l_ind = l_ind, l_val = l_val)

结果:

## [[1]]
##      [,1] [,2]
## [1,]    5    0
## [2,]    0    0
## 
## [[2]]
##      [,1] [,2]
## [1,]    4    7
## [2,]    0    0