R 如何基于数据帧对空间光栅进行重新分类

R 如何基于数据帧对空间光栅进行重新分类,r,function,raster,R,Function,Raster,我正在尝试对空间光栅的每个单元执行计算 实际上,光栅表示一个数字高程模型,非常大(1280000000个单元格),我使用潮汐高度来计算每个单元格出现的比例(暴露在空气中) 例如: 潮汐资料 df <- c(3.879, 4.078, 4.211, 4.252, 4.204, 4.077, 3.872, 3.588, 3.259, 2.883, 2.48, 2.065, 1.635, 1.199, 0.766999999999999, 0.339, -0.0840000000000005

我正在尝试对空间光栅的每个单元执行计算

实际上,光栅表示一个数字高程模型,非常大(1280000000个单元格),我使用潮汐高度来计算每个单元格出现的比例(暴露在空气中)

例如:

潮汐资料

df <- c(3.879, 4.078, 4.211, 4.252, 4.204, 4.077, 3.872, 3.588, 3.259, 
2.883, 2.48, 2.065, 1.635, 1.199, 0.766999999999999, 0.339, 
-0.0840000000000005, 
-0.503, -0.906, -1.284, -1.649, -1.998, -2.326, -2.603, -2.801, 
-2.959, -3.108, -3.237, -3.329, -3.353, -3.343, -3.303, -3.199, 
-3.041, -2.803, -2.503, -2.173, -1.789, -1.348, -0.869000000000001, 
-0.373, 0.141999999999999, 0.657999999999999, 1.207, 1.728, 2.226, 
2.683, 3.055, 3.393, 3.655, 3.841, 3.956, 3.988, 3.938, 3.816, 
3.63, 3.365, 3.047, 2.69, 2.292, 1.871, 1.433, 0.981999999999999, 
0.524, 0.0759999999999996, -0.367, -0.805000000000001, -1.226, 
-1.637, -2.036, -2.422, -2.741, -2.956, -3.137, -3.322, -3.481, 
-3.593, -3.662, -3.727, -3.791, -3.79, -3.707, -3.557, -3.356, 
-3.077, -2.732, -2.354, -1.962, -1.515, -1.035, -0.515000000000001, 
0.00599999999999934, 0.532999999999999, 1.05, 1.563, 2.032, 2.462, 
2.794, 3.098, 3.313)

df以下是一种您可以尝试的方法

library(compiler)
ff <- cmpfun(f)
x <- calc(r1, ff)
我将
df
重命名为
v
,只是为了明确它是一个数值向量,而不是(也不应该)一个data.frame

v <- df
lv <- length(v)

f <- function(i) {
    depth <- v - rep(i, lv)
    mean(depth < 0) 
}
现在使用它

x <- calc(r1, f) 
或者更好:

library(Rcpp)
fcpp2 <- cppFunction('std::vector<double> flood(std::vector<double> x) {
    // [[Rcpp::plugins(cpp11)]] 
    unsigned sizex = x.size();
    std::vector<double> out(sizex);
    std::vector<double> v = {3.879, 4.078, 4.211, 4.252, 4.204, 4.077, 3.872, 3.588, 3.259, 2.883, 2.48, 2.065, 1.635, 1.199, 0.766999999999999, 0.339, -0.0840000000000005, -0.503, -0.906, -1.284, -1.649, -1.998, -2.326, -2.603, -2.801, -2.959, -3.108, -3.237, -3.329, -3.353, -3.343, -3.303, -3.199, -3.041, -2.803, -2.503, -2.173, -1.789, -1.348, -0.869000000000001, -0.373, 0.141999999999999, 0.657999999999999, 1.207, 1.728, 2.226, 2.683, 3.055, 3.393, 3.655, 3.841, 3.956, 3.988, 3.938, 3.816, 3.63, 3.365, 3.047, 2.69, 2.292, 1.871, 1.433, 0.981999999999999, 0.524, 0.0759999999999996, -0.367, -0.805000000000001, -1.226, -1.637, -2.036, -2.422, -2.741, -2.956, -3.137, -3.322, -3.481, -3.593, -3.662, -3.727, -3.791, -3.79, -3.707, -3.557, -3.356, -3.077, -2.732, -2.354, -1.962, -1.515, -1.035, -0.515000000000001, 0.00599999999999934, 0.532999999999999, 1.05, 1.563, 2.032, 2.462, 2.794, 3.098, 3.313};
    unsigned sizev = v.size();
    for (size_t j=0; j<sizex; j++) {
        if (std::isnan(x[j])) {
            out[j] = NAN;
        } else {
            unsigned depth = 0;
            for (size_t i=0; i<sizev; i++) {
                depth += ((v[i] - x[j]) < 0);
            }
            out[j] = (double(depth) / sizev);
        }
    }
    return(out);
}')

r2 <- setValues(r1, fcpp2(values(r1)))
库(Rcpp)

fcpp2非常感谢,我正在完成这项工作,并将再次获得反馈谢谢,我已经尝试了您在我的数据集上提供的选项,并在rgdal::getRasterData中获得了错误-错误(object@file@con,offset=offs,region.dim=reg,:在光栅IO过程中失败。快速的google给了我一些尝试的选项-我相信这是光栅的问题?这是文件的问题。可能是因为磁盘(临时文件夹)已满?这非常有效-原始光栅是许多.asc文件的拼图,在拼图之前,我已将该功能应用于每个单独的文件。再次感谢
f(r1[2]) 
x <- calc(r1, f) 
x <- calc(r1, function(i) mean((v-rep(i,lv)) < 0) )
library(compiler)
ff <- cmpfun(f)
x <- calc(r1, ff)
library(Rcpp)

fcpp <- cppFunction('double flood(double x) {
    // [[Rcpp::plugins(cpp11)]] 
    if (std::isnan(x)) return(NAN);
    std::vector<double> v = {3.879, 4.078, 4.211, 4.252, 4.204, 4.077, 3.872, 3.588, 3.259, 2.883, 2.48, 2.065, 1.635, 1.199, 0.766999999999999, 0.339, -0.0840000000000005, -0.503, -0.906, -1.284, -1.649, -1.998, -2.326, -2.603, -2.801, -2.959, -3.108, -3.237, -3.329, -3.353, -3.343, -3.303, -3.199, -3.041, -2.803, -2.503, -2.173, -1.789, -1.348, -0.869000000000001, -0.373, 0.141999999999999, 0.657999999999999, 1.207, 1.728, 2.226, 2.683, 3.055, 3.393, 3.655, 3.841, 3.956, 3.988, 3.938, 3.816, 3.63, 3.365, 3.047, 2.69, 2.292, 1.871, 1.433, 0.981999999999999, 0.524, 0.0759999999999996, -0.367, -0.805000000000001, -1.226, -1.637, -2.036, -2.422, -2.741, -2.956, -3.137, -3.322, -3.481, -3.593, -3.662, -3.727, -3.791, -3.79, -3.707, -3.557, -3.356, -3.077, -2.732, -2.354, -1.962, -1.515, -1.035, -0.515000000000001, 0.00599999999999934, 0.532999999999999, 1.05, 1.563, 2.032, 2.462, 2.794, 3.098, 3.313};
    unsigned lv = v.size();
    unsigned depth = 0;
    for (size_t i=0; i<lv; i++) {
        depth += ((v[i] - x) < 0);
    }
    return (double(depth) / lv);
}')


x <- calc(r1, fcpp)
r2 <- setValues(r1, sapply(values(r1),  fcpp))
library(Rcpp)
fcpp2 <- cppFunction('std::vector<double> flood(std::vector<double> x) {
    // [[Rcpp::plugins(cpp11)]] 
    unsigned sizex = x.size();
    std::vector<double> out(sizex);
    std::vector<double> v = {3.879, 4.078, 4.211, 4.252, 4.204, 4.077, 3.872, 3.588, 3.259, 2.883, 2.48, 2.065, 1.635, 1.199, 0.766999999999999, 0.339, -0.0840000000000005, -0.503, -0.906, -1.284, -1.649, -1.998, -2.326, -2.603, -2.801, -2.959, -3.108, -3.237, -3.329, -3.353, -3.343, -3.303, -3.199, -3.041, -2.803, -2.503, -2.173, -1.789, -1.348, -0.869000000000001, -0.373, 0.141999999999999, 0.657999999999999, 1.207, 1.728, 2.226, 2.683, 3.055, 3.393, 3.655, 3.841, 3.956, 3.988, 3.938, 3.816, 3.63, 3.365, 3.047, 2.69, 2.292, 1.871, 1.433, 0.981999999999999, 0.524, 0.0759999999999996, -0.367, -0.805000000000001, -1.226, -1.637, -2.036, -2.422, -2.741, -2.956, -3.137, -3.322, -3.481, -3.593, -3.662, -3.727, -3.791, -3.79, -3.707, -3.557, -3.356, -3.077, -2.732, -2.354, -1.962, -1.515, -1.035, -0.515000000000001, 0.00599999999999934, 0.532999999999999, 1.05, 1.563, 2.032, 2.462, 2.794, 3.098, 3.313};
    unsigned sizev = v.size();
    for (size_t j=0; j<sizex; j++) {
        if (std::isnan(x[j])) {
            out[j] = NAN;
        } else {
            unsigned depth = 0;
            for (size_t i=0; i<sizev; i++) {
                depth += ((v[i] - x[j]) < 0);
            }
            out[j] = (double(depth) / sizev);
        }
    }
    return(out);
}')

r2 <- setValues(r1, fcpp2(values(r1)))