在 r 中应用函数太慢
Apply function too slow in r
我必须为很多物种计算每行的特定公式。该公式是丰度值与数据框最后一行中存在的值之间的乘积。然后,将所有这些产品相加。
我当前的脚本包括使用一个 apply 函数,它看起来和我开始使用的 for 循环一样慢。
我使用名为 az
的简单 df 简化了以下脚本中的问题:
az=data.frame(c(1,2,10),c(2,4,20),c(3,6,30))
colnames(az)=c("a","b","c")
# Initial for loop
prov=0 # prov for provisional number
for (i in 1:nrow(az)){
for (j in 1:ncol(az)){
prov=prov+az[i,j]*az[nrow(az),j]
}
print(prov)
prov=0
}
# Apply solution
apply(az[,], 1, function(x) {sum(x*az[nrow(az),], na.rm=TRUE)})
这两种解决方案都有效,但它们都很慢(使用我原来的 df),我必须对大量物种重复该操作。
因此,我想知道是否有人有更有效的解决方案,也许使用矢量化表达式。
亲切的问候。
尝试
rowSums(az*unlist(az[nrow(az),])[col(az)], na.rm=TRUE)
或者稍微快一点的选择是使用 rep
rowSums(az*rep(unlist(az[nrow(az),]),each=ncol(az)), na.rm=TRUE)
最快的解决方案可能是矩阵代数:
apply(az[,], 1, function(x) {sum(x*az[nrow(az),], na.rm=TRUE)})
#[1] 140 280 1400
m <- as.matrix(az)
m[is.na(m)] <- 0 #remove NA from sums
as.vector(m %*% m[nrow(m),])
#[1] 140 280 1400
我必须为很多物种计算每行的特定公式。该公式是丰度值与数据框最后一行中存在的值之间的乘积。然后,将所有这些产品相加。
我当前的脚本包括使用一个 apply 函数,它看起来和我开始使用的 for 循环一样慢。
我使用名为 az
的简单 df 简化了以下脚本中的问题:
az=data.frame(c(1,2,10),c(2,4,20),c(3,6,30))
colnames(az)=c("a","b","c")
# Initial for loop
prov=0 # prov for provisional number
for (i in 1:nrow(az)){
for (j in 1:ncol(az)){
prov=prov+az[i,j]*az[nrow(az),j]
}
print(prov)
prov=0
}
# Apply solution
apply(az[,], 1, function(x) {sum(x*az[nrow(az),], na.rm=TRUE)})
这两种解决方案都有效,但它们都很慢(使用我原来的 df),我必须对大量物种重复该操作。 因此,我想知道是否有人有更有效的解决方案,也许使用矢量化表达式。
亲切的问候。
尝试
rowSums(az*unlist(az[nrow(az),])[col(az)], na.rm=TRUE)
或者稍微快一点的选择是使用 rep
rowSums(az*rep(unlist(az[nrow(az),]),each=ncol(az)), na.rm=TRUE)
最快的解决方案可能是矩阵代数:
apply(az[,], 1, function(x) {sum(x*az[nrow(az),], na.rm=TRUE)})
#[1] 140 280 1400
m <- as.matrix(az)
m[is.na(m)] <- 0 #remove NA from sums
as.vector(m %*% m[nrow(m),])
#[1] 140 280 1400