我有一个大矩阵(m),我想用新值(new_values)替换与向量(values_to_be_replaced)中存储的值匹配的矩阵(m)中的值。我的向量本身存储在数据帧中,因此我可以在数据帧上循环以获取向量,然后检查向量中是否包含矩阵值。下面的代码完成了应做的事情,但是对于我的输入数据来说太慢了。我的原始数据是一个有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]
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句