避免 for() 循环和 if 在 R 中

Avoid a for() loop and if in R

我有一个关于在 R 中避免 for() 循环的问题。我查看了关于这个主题的所有帖子,但没有任何答案可以回答我的问题。所以我有两个数据文件,一个文件包含 60 个城市的纬度和经度(参见 CSV file) and one 2D array file with multiple variables (see this netCDF file)。我有一个小计算,可以将每个 lat-lon 转换为 row-col。在 row-col 计算之后,这些数字用于编辑 netCDF 文件中的变量。在下面的修订代码中,我使用了 for() 循环。有没有办法避免 for() 循环和 if() 条件?

#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)

您可以使用以下代码更新您的 csv 文件的列:

outbreak$lat = abs(round((outbreak$lat- 55.25833)/0.08333333))
outbreak$lon = abs(round((outbreak$lon + 5.416667)/0.1666667))

使用 dplyr 你可以在一行中完成:

library(dplyr)

outbreak %>% mutate(row = abs(round((.[,2] - 55.25833)/0.08333333)), col = abs(round((.[,3] + 5.416667)/0.1666667)))