避免for()循环,如果在R
我有一个关于在R中避免for()循环的问题。我已经查看了关于该主题的所有帖子,没有任何回答我的问题。所以在这里,我有两个数据文件,一个文件包含60个城市的经纬度(参见CSV file)和一个包含多个变量的二维数组文件(请参阅此netCDF file)。我有一个小的计算,将每个纬度转换为一个行。在行计算之后,这些数字用于编辑netCDF文件中的变量。在下面的REVISED代码中,我使用了for()循环。有没有办法避免for()循环和if()条件?避免for()循环,如果在R
#install.packages("ncdf4", dependencies = T)
library(ncdf4)
episim <- nc_open("England_aggr_GPW4_2000_0000.nc", write = TRUE)
currInhabitable <- t(ncvar_get(episim, episim$var[[4]]))
S <- t(ncvar_get(episim, episim$var[[1]]))
I <- matrix(0, 64, 44, byrow = T)
outbreak <- read.csv("60cities-lat-lon.csv", header = T)
for (ff in 1:dim(outbreak)[1])
{
row <- abs(round((outbreak[ff,2] - 55.25833)/0.08333333))
col <- abs(round((outbreak[ff,3] + 5.416667)/0.1666667))
newInf <- outbreak[ff,4]
#print(paste("Is the current cell inhabitable or not?", currInhabitable[row, col]))
if (currInhabitable[row, col] == 1 & S[row, col] > newInf)
{
S[row,col] <- S[row,col] - newInf
I[row,col] <- I[row,col] + newInf
}
print(c(row, col, S[row,col], I[row,col]))
}
t = 1
print(paste("Epidemic state saved to a netCDF file on day", t))
episimNew <- nc_create(paste("England_aggr_GPW4_2000_000", t, ".nc", collapse="", sep=""), episim$var)
ncvar_put(episimNew, episimNew$var[[1]], t(S))
ncvar_put(episimNew, episimNew$var[[2]], t(I))
nc_close(episimNew)
nc_close(episim)
使用dplyr
你可以做一个行:
library(dplyr)
outbreak %>% mutate(row = abs(round((.[,2] - 55.25833)/0.08333333)), col = abs(round((.[,3] + 5.416667)/0.1666667)))
你想做什么?如果你正在尝试使用空间数据,也许你正在做的不是正确的方式 –
嗨@aldo_tapia,是的我正在使用空间数据,但我正在处理矩阵。我正在尝试避免()循环。我从来没有能够理解和使用lapply或sapply。你有什么建议吗?非常感谢您的反馈或解决此问题。诚挚 –
您可以通过使用这些代码更新您的CSV文件的列:
outbreak$lat = abs(round((outbreak$lat- 55.25833)/0.08333333))
outbreak$lon = abs(round((outbreak$lon + 5.416667)/0.1666667))
看看'sapply'链接这里:https://www.datacamp.com/community/tutorials/r-tutorial-apply-family – Wen