这可能很容易解决。我有一个mat500行×335列的2D矩阵,以及一个dat120425行的data.frame。data.frame dat有两列I和J,它们是从索引到行的整数mat。我想将的值从添加mat到的行中dat。这是我的概念上的失败:> dat$matval <- mat[dat$I, dat$J]Error: cannot allocate vector of length 1617278737(我在Win32上使用R 2.13.1)。深入研究,我发现我在滥用矩阵索引,因为看来我只是得到的子矩阵mat,而不是我所期望的一维值数组,即:> str(mat[dat$I[1:100], dat$J[1:100]]) int [1:100, 1:100] 20 1 1 1 20 1 1 1 1 1 ...我期待着类似的东西int [1:100] 20 1 1 1 20 1 1 1 1 1 ...。使用行,列的索引获取值来索引2D矩阵的正确方法是什么?
3 回答
呼如林
TA贡献1798条经验 获得超3个赞
几乎。需要提供给“ [”作为两列矩阵:
dat$matval <- mat[ cbind(dat$I, dat$J) ] # should do it.
有一个警告:尽管这也适用于数据帧,但它们首先被强制转换为矩阵类,如果有任何非数字类,则整个矩阵将成为“最低分母”类。
牛魔王的故事
TA贡献1830条经验 获得超3个赞
这是使用apply基于行的操作的单线
> dat <- as.data.frame(matrix(rep(seq(4),4),ncol=2))
> colnames(dat) <- c('I','J')
> dat
I J
1 1 1
2 2 2
3 3 3
4 4 4
5 1 1
6 2 2
7 3 3
8 4 4
> mat <- matrix(seq(16),ncol=4)
> mat
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> dat$K <- apply( dat, 1, function(x,mat) mat[ x[1], x[2] ], mat=mat )
> dat
I J K
1 1 1 1
2 2 2 6
3 3 3 11
4 4 4 16
5 1 1 1
6 2 2 6
7 3 3 11
8 4 4 16
- 3 回答
- 0 关注
- 748 浏览
添加回答
举报
0/150
提交
取消