假设我有一个包含三行的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
答案 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