R中2-d矩阵的指数和值

时间:2014-04-01 06:10:43

标签: r matrix reshape

假设我有一个包含三行的data.frame:x,y和f(x,y)。 x和y以整数值(即指向矩阵的索引)网格化。在R中是否有一个干净的方法从这三列事物到f(x,y)值的矩阵,其中每个条目对应于我之前的(x,y,f(x,y))三元组?我想避免做一个for循环,虽然这当然是一个简单的选择。

即。如果不清楚,我想从:

x, y, f.x_y;
1, 1, 3.1;
1, 2, 35.5;
1, 3, 4.4;
2, 1, 3.1; 
2, 2, 3.3;
2, 3, 5.5;
3, 1, 24.1;
3, 2, 3.14;
3, 3, 3.55;

----到-----

3.1, 3.1, 24.1;   
35.5, 3.3, 3.14;
4.4, 5.5, 3.55 

2 个答案:

答案 0 :(得分:3)

以下是需要考虑的四个选项。

在基地R:

reshape(mydf, direction = "wide", idvar="x", timevar="y")
#   x f.x_y.1 f.x_y.2 f.x_y.3
# 1 1     3.1   35.50    4.40
# 4 2     3.1    3.30    5.50
# 7 3    24.1    3.14    3.55

xtabs(f.x_y ~ x + y, mydf)
#    y
# x       1     2     3
#   1  3.10 35.50  4.40
#   2  3.10  3.30  5.50
#   3 24.10  3.14  3.55

unstack(mydf, f.x_y ~ y)
#     X1    X2   X3
# 1  3.1 35.50 4.40
# 2  3.1  3.30 5.50
# 3 24.1  3.14 3.55

使用“reshape2”包:

library(reshape2)
dcast(mydf, x ~ y, value.var="f.x_y")
#   x    1     2    3
# 1 1  3.1 35.50 4.40
# 2 2  3.1  3.30 5.50
# 3 3 24.1  3.14 3.55

这假定像这样的data.frame作为您的源数据:

mydf <- data.frame(x = rep(1:3, each = 3),
                   y = rep(1:3, times = 3),
                   f.x_y = c(3.1, 35.5, 4.4, 3.1, 3.3, 
                             5.5, 24.1, 3.14, 3.55))
mydf
#   x y f.x_y
# 1 1 1  3.10
# 2 1 2 35.50
# 3 1 3  4.40
# 4 2 1  3.10
# 5 2 2  3.30
# 6 2 3  5.50
# 7 3 1 24.10
# 8 3 2  3.14
# 9 3 3  3.55

答案 1 :(得分:3)

使用@ Ananda的示例数据的另一种选择:

m <- with(mydf, matrix(NA, nrow=max(x), ncol=max(y) ) 
m[as.matrix(mydf[1:2])] <- mydf$f.x_y
m

#     [,1]  [,2] [,3]
#[1,]  3.1 35.50 4.40
#[2,]  3.1  3.30 5.50
#[3,] 24.1  3.14 3.55