繁体   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