使用colnames和rownames使用R中的列值填充矩阵

时间:2014-01-08 16:00:38

标签: r matrix

我有一个非常大的数据集,所以我想避免循环。

我有三列数据:

  

col1 =时间显示为10000,10001,10002,10100,10101,10102,   10200,10201,10202,10300,...(共18000次)

     

col2 =身份证号码1 2 3 4 ...(总共500 ids)

     

col3 =在特定时间与特定ID相关联的读数。 0.1   0.5 0.6 0.7 ...说这叫做Data3

     

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的每一行,用Data3 [,3]完成DataMatrix,将它放在矩阵的行和列中,其名称与Data3 [,1]相关和Data3 [,2]。但没有循环。

感谢那些聪明的人。

2 个答案:

答案 0 :(得分:1)

这是一个解决方案,其可能的id值为1:10,次数值为1:20。首先,创建数据:

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将每个可能的time / 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  

答案 1 :(得分: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