2014-01-08 86 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