【问题标题】:Fill matrix with column values in R using colnames and rownames使用列名和行名用 R 中的列值填充矩阵
【发布时间】:2014-01-26 20:15:51
【问题描述】:

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

我有三列数据:

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

col2 = id 编号 1 2 3 4 ...(总共 500 个 id)

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] 放置在名称与 Data3[,1] 相关的矩阵的行和列中来完成 DataMatrix和数据3 [,2]。但没有循环。

感谢所有聪明的人。

【问题讨论】:

  • 为什么说“有数据缺失,所以简单的reshape 不行”?你试过了吗?什么对解决方案不起作用?如果您提供一个(小)可重现的示例来展示您预期会遇到的情况/问题,那么您更有可能获得有意义的帮助。
  • library(reshape2); DataMatrix <- dcast(Data3, col1~col2, value.var="col3") 呢?
  • 谢谢阿南达 - 你是对的 - 玩耍绝对是前进的方向。我认为可能有一些我不知道的匹配或查找功能。丢失的数据意味着 Data3 不是 18000*500 长,而是更少。因此,重塑灾难。

标签: r matrix


【解决方案1】:

这是一个解决方案,可能 id 值在 1:10,time 值在 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 将时间/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  

【讨论】:

    【解决方案2】:

    如果我理解正确的话:

    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
    

    【讨论】:

    • 我认为,如果您的数据没有所有可能的 col1 和 col2 值,这可能无法完全工作。如果有,它会的。
    • 感谢 LukeA 和 BrodieG。我现在正在尝试,非常兴奋!手指交叉:)
    • 这真是太棒了!非常感谢你们这些精彩的星星!! ****
    • @user3173922,您应该将适合您的答案标记为已回答。交易
    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2021-05-18
    • 2022-12-11
    • 2014-07-28
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多