簡體   English   中英

使用列名和行名在R中用列值填充矩陣

[英]Fill matrix with column values in R using colnames and rownames

我有一個非常大的數據集,所以我想避免循環。

我有三列數據:

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不適用不適用不適用....

有沒有辦法讓R遍歷Data3的每一行,通過將Data3 [,3]讀入名稱與Data3 [,1]和Data3 [有關的矩陣的行和列中來完成DataMatrix ,2]。 但是沒有循環。

感謝所有聰明的人。

這是一個可能的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將時間/ 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  

如果我正確理解您的意見:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM