簡體   English   中英

替換矩陣 (R) 中值的有效方法

[英]Efficient way of replacing values in matrix (R)

我有一個大矩陣 (m),我想用新值 (new_values) 替換矩陣 (m) 中與存儲在向量 (values_to_be_replaced) 中的值匹配的值。 我的向量本身存儲在數據幀中,因此我可以遍歷數據幀以獲取向量,然后檢查矩陣值是否包含在向量中。 下面的代碼做了它應該做的事情,但是對於我的輸入數據來說太慢了。 我的原始數據是一個有 4600 行和 5900 列的矩陣,我的 750 個向量中最大的一個包含 > 600 萬個要比較的數字。

我想有一種更有效的方法可以做到這一點並加快計算時間。 有人可以幫我弄清楚嗎? (我的矩陣中有很多 -9999 值,因此跳過它們可以縮短計算時間,但這可能還不夠)

這是一個用 R 編寫的示例:

library("dplyr")
## setting up the input dataframe
df<-setNames(data.frame(matrix(ncol = 4, nrow = 50)), c("ids", "var1", "var2", "var3"))
df$ids<-seq(1, 50,1)
df$var1<-rep(c(2, 4, 2, 1, 3, 5,1, 1,1, 6), each = 5)
df$var2<-rep(c(2, 4, 2, 1, 3, 5,1, 1,1, 6), each = 5)
df$var3<-rep(c(2, 4, 2, 1, 3, 5,1, 1,1, 6), each = 5)

##summarizing it by variables and ids
df<-df%>%
  group_by(var1, var2, var3)%>%
  summarise(ids=toString(ids))%>%data.frame()

##giving a new value by which values in matrix should be replaced
df$new_values<-c("101", "102", "103", "104", "105", "106")

##setting up a matrix
m = matrix( c(16, -9999,17, -9999, 18), nrow=5,  ncol=10, byrow = TRUE)        # fill matrix by rows 

##looping over dataframe
y<-0
for (i in 1:length(df$ids)) {
  values_to_be_replaced<-strsplit(df$ids[i], ",")
  values_to_be_replaced<-unlist(values_to_be_replaced, use.names=FALSE)
  values_to_be_replaced<-gsub(" ", "", values_to_be_replaced, fixed = TRUE)
  print(values_to_be_replaced)
  print(i)
  #print(length(values_to_be_replaced))
  m<-apply(m, 1:2, function(x) ifelse(x %in% values_to_be_replaced, df$new_values[i], x))
  #print(values_to_be_replaced)
  y<-y+1
}

我不知道這是什么語言,但從你所描述的情況來看,構建一個從值映射到矩陣中的“單元格”的反向查找表可能會更有效,然后使用該表查找需要更新的單元格(而不是多次循環所有這些單元格)。

如果您的語言或其標准庫具有哈希表/哈希映射之類的內置實現,請使用它。

在矩陣中的單元格因匹配“要替換的值”之一而更新后,是否可以因為值匹配不同的“要替換的值”而再次更新它? 如果是這樣,則必須在更新實際矩陣的同時更新反向查找表,否則會出現錯誤。

可以對“要替換的值”的向量進行預處理以避免這種情況,這樣一旦構建了反向查找表,您就可以在整個過程中使用它而無需更新它。 然后在最后丟棄它(在完成所有替換之后)。 然而,獲得正確的代碼比僅僅更新反向查找表和矩陣要稍微復雜一些。

在 R 中,您可以只調用匹配的元素,而不是遍歷它們:

for (i in 1:length(df$ids)) {
  values_to_be_replaced<-strsplit(gsub(" ","",df$ids[i]), ",")[[1]]
  values_to_be_replaced<-as.numeric(values_to_be_replaced)
  m[m %in% values_to_be_replaced] <- df$new_values[i]
}

暫無
暫無

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

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