2014-01-08 140 views
1

我有一個非常大的數據集,所以我想避免循環。使用列名和rownames填充R中列值的矩陣

我有三列數據:

COL1 =時間顯示爲10000,10001,10002,10100,10101,10102,10200 ,10201,10202,10300,...(總18000次)

COL2 = id號1 2 3 4 ...(總共500個IDS)

COL3 =與特定時間特定的ID讀取。 0.1 0.5 0.6 0.7 ...說這是所謂的數據3

10000 1 0.1

10001 1 0.5

10002 1 0.6

10100 1 0.7

10200 1 0.6(注 - 一些隨機條目丟失)

我想把它作爲一個矩陣(稱爲DataMatrix),但缺少數據,因此簡單的重塑將無法完成。我想將缺少的數據作爲NA條目。

DataMatrix目前是500列18000行的NA矩陣,其中行名和列名分別是時間和ID。

1 2 3 4 ....

10000 NA NA NA NA ....

10001 NA NA NA NA ....

有一種方法我可以讓R遍歷Data3的每一行,通過將DataMatrix放在名稱與Data3 [,1]和Data3 [,2]相關的矩陣的行和列中來完成讀取Data3 [,3]的DataMatrix。但沒有循環。

感謝你們所有的聰明人。

+2

爲什麼你說「有數據缺失,所以一個簡單的重塑不會做」?你試過了嗎?什麼沒有解決方案的工作?如果您提供一個(小)可重複的示例來說明您期望遇到的情況/問題,那麼您更有可能獲得有意義的幫助。 – A5C1D2H2I1M1N2O1R2T1

+0

'library(reshape2); DataMatrix < - dcast(Data3,col1〜col2,value.var =「col3」)'? – lukeA

+0

謝謝阿南達 - 你是對的 - 玩耍無疑是前進的方向。我認爲可能會有一些匹配或查找功能,我不知道。 缺失的數據意味着Data3不是18000 * 500長,但更少。因此,重塑災難。 – user3173922

回答

0

如果我理解正確你:

Data3 <- data.frame(col1=10000:10499, 
        col2=1:500, 
        col3=round(runif(500),1)) 

library(reshape2) 
DataMatrix <- dcast(Data3, col1~col2, value.var="col3") 
DataMatrix[1:5, 1:5] 
# col1 1 2 3 4 
# 1 10000 0.4 NA NA NA 
# 2 10001 NA 0.6 NA NA 
# 3 10002 NA NA 0.9 NA 
# 4 10003 NA NA NA 0.5 
# 5 10004 NA NA NA NA 
+0

如果您的數據沒有所有可能的col1和col2值,我認爲這可能無法完全工作。它會如果它。 – BrodieG

+0

感謝這個LukeA和BrodieG。我現在正在嘗試它,非常興奮!手指劃過:) – user3173922

+0

這是friggin'真棒!非常感謝你精彩的星星! **** – user3173922

1

這裏是在1:20 1:10和時間值可能的ID值的解決方案。首先,創建數據:

mx <- matrix(c(sample(1:20, 5), sample(1:10, 5), sample(1:50, 5)), ncol=3, dimnames=list(NULL, c("time", "id", "reading"))) 
times <- 1:20 
ids <- 1:10 
mx 
#  time id reading 
# [1,] 4 3  25 
# [2,] 5 4  9 
# [3,] 9 7  45 
# [4,] 18 1  40 
# [5,] 11 8  28 

現在,使用outer傳遞的時間每一個可能的組合和/ id來返回相應reading值查找函數:

outer(times, ids, 
    function(x, y) { 
    mapply(function(x.sub, y.sub) { 
     val <- mx[mx[, 1] == x.sub & mx[, 2] == y.sub, 3] 
     if(length(val) == 0L) NA_integer_ else val 
    }, 
    x, y) 
}) 

這產生了(希望)想要的答案:

#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
# [1,] NA NA NA NA NA NA NA NA NA NA 
# [2,] NA NA NA NA NA NA NA NA NA NA 
# [3,] NA NA NA NA NA NA NA NA NA NA 
# [4,] NA NA 25 NA NA NA NA NA NA NA 
# [5,] NA NA NA 9 NA NA NA NA NA NA 
# [6,] NA NA NA NA NA NA NA NA NA NA 
# [7,] NA NA NA NA NA NA NA NA NA NA 
# [8,] NA NA NA NA NA NA NA NA NA NA 
# [9,] NA NA NA NA NA NA 45 NA NA NA 
# [10,] NA NA NA NA NA NA NA NA NA NA 
# [11,] NA NA NA NA NA NA NA 28 NA NA 
# [12,] NA NA NA NA NA NA NA NA NA NA 
# [13,] NA NA NA NA NA NA NA NA NA NA 
# [14,] NA NA NA NA NA NA NA NA NA NA 
# [15,] NA NA NA NA NA NA NA NA NA NA 
# [16,] NA NA NA NA NA NA NA NA NA NA 
# [17,] NA NA NA NA NA NA NA NA NA NA 
# [18,] 40 NA NA NA NA NA NA NA NA NA 
# [19,] NA NA NA NA NA NA NA NA NA NA 
# [20,] NA NA NA NA NA NA NA NA NA NA