2014-04-01 63 views
0

假設我有一個包含三行的數據框:x,y和f(x,y)。 x和y以整數值格式化(即指向矩陣的索引)。是否有一個乾淨的方法,從這三列的東西到一個f(x,y)值的矩陣,其中每個條目對應於我之前擁有的(x,y,f(x,y))三元組?我想避免做一個for循環,雖然這當然是一個簡單的選擇。R中的二維矩陣的索引和值

I.e.如果說不清楚,我想從去:

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

你能提供一些數據的例子嗎?一個[簡單的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)將大大有助於確定一個簡單的答案。 – thelatemail

+1

您只是想將1d f(x,y)列重塑爲2D矩陣?與位置基於x,y列...? – beroe

+0

是的,正是@beroe所說的。我希望這個例子有助於......! –

回答

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 
+0

非常感謝! –

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 
+0

矩陣索引,呃? +1 :-) – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto - 我不認爲很多人意識到你可以使用'row/col'矩陣進行索引。我想你已經涵蓋了所有其他的可能性! – thelatemail