基本上,我以ASCII的形式计算了一个全局分布概率模型,比如说:
gdpm.gdpm的值都在0到1之间.
然后我从shape文件中导入了一个本地地图:
shape <- file.choose()
map <- readOGR(shape, basename(file_path_sans_ext(shape)))
Run Code Online (Sandbox Code Playgroud)
下一步,我进行栅格化gdpm,并使用本地地图进行裁剪:
ldpm <- mask(gdpm, map)
Run Code Online (Sandbox Code Playgroud)
然后,我将这个连续模型重新分类为离散模型(我将模型划分为6个级别):
recalc <- matrix(c(0, 0.05, 0, 0.05, 0.2, 1, 0.2, 0.4, 2, 0.4, 0.6, 3, 0.6, 0.8, 4, 0.8, 1, 5), ncol = 3, byrow = TRUE)
ldpmR <- reclassify(ldpm, recalc)
Run Code Online (Sandbox Code Playgroud)
我有一个裁剪和重新分类的栅格,现在我需要总结一下土地覆盖,也就是说,每个级别,我想计算它在本地地图每个区域的面积比例.(我不知道如何用术语来描述它).我发现并追随了一个例子(RobertH):
ext <- raster::extract(ldpmR, map)
tab <- sapply(ext, function(x) tabulate(x, 10))
tab <- tab / colSums(tab)
Run Code Online (Sandbox Code Playgroud)
但我不确定它是否有效,因为输出结果tab令人困惑.
那么如何正确计算土地覆盖面积呢?如何在每个多边形中应用正确的方法?
我的原始数据太大,我只能提供另一种栅格(我认为这个例子应该应用不同的重分类矩阵):
或者您可以生成测试栅格(RobertH): …
我从这里借用了这个示例数据集:
# Load library
library(ggplot2)
# Load data
data(mtcars)
# Plot data
p <- ggplot(mtcars,aes(x = disp, y = mpg)) + geom_point() + facet_grid(gear ~ am)
p <- p + geom_smooth(method="lm")
print(p)
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,回归方法和公式在所有方面都是相同的。如果我们想指定构面(或面板) 6 的公式,我们可以使用以下代码:
# Smoothing function with different behaviour depending on the panel
custom.smooth <- function(formula, data,...){
smooth.call <- match.call()
if(as.numeric(unique(data$PANEL)) == 6) {
# Linear regression
smooth.call[[1]] <- quote(lm)
# Specify formula
smooth.call$formula <- as.formula("y ~ log(x)")
}else{
# Linear regression
smooth.call[[1]] <- …Run Code Online (Sandbox Code Playgroud) # example data
df <- structure(c(-1, 0, 0, -1, -1, 2), .Dim = 2:3)
# how it looks like
df
r$> df
[,1] [,2] [,3]
[1,] -1 0 -1
[2,] 0 -1 2
# construct a data.frame using two rows of df
data.frame(df[1:2, ])
r$> data.frame(df[1:2,])
X1 X2 X3
1 -1 0 -1
2 0 -1 2
# construct a data.frame using only one row of df
data.frame(df[1, ])
r$> data.frame(df[1, ])
df.1...
1 -1
2 0
3 -1
Run Code Online (Sandbox Code Playgroud)
data.frame(df[1:2,]) …
我用 R 编写了一个小型下载器,以便一次运行从远程服务器下载一些日志文件:
file_remote <- fun_to_list_URLs()
file_local <- fun_to_gen_local_paths()
credentials <- "usr/pwd"
downloader <- function(file_remote, file_local, credentials) {
data_bin <- RCurl::getBinaryURL(
file_remote,
userpwd = credentials,
ftp.use.epsv = FALSE,
forbid.reuse = TRUE
)
writeBin(data_bin, file_local)
}
purrr::walk2(
file_remote,
file_local,
~ downloader(
file_remote = .x,
file_local = .y,
credentials = credentials
)
)
Run Code Online (Sandbox Code Playgroud)
这可行,但速度很慢,尤其是与 WinSCP 等一些 FTP 客户端相比,下载 64 个日志文件,每个 2kb,需要几分钟。
R中有没有更快的方法来下载大量文件?
我有一个清单:
alist <- list(x = c(1, 2, 3),
y = c(4, 5, 6))
> alist
$x
[1] 1 2 3
$y
[1] 4 5 6
Run Code Online (Sandbox Code Playgroud)
我想为每个列表组件命名,使其成为:
> alist
$x
t1 t2 t3
1 2 3
$y
t1 t2 t3
4 5 6
Run Code Online (Sandbox Code Playgroud)
我尝试使用lapply():
lapply(alist, function(x) names(x) <- c("t1","t2","t3"))
Run Code Online (Sandbox Code Playgroud)
但输出是:
$x
[1] "t1" "t2" "t3"
$y
[1] "t1" "t2" "t3"
Run Code Online (Sandbox Code Playgroud)
这里有什么问题?我如何在这里正确使用 lapply?因为我有一个相当大的清单。
我有一些大型的geoTIFF,现在我想将它们转换为ASCII文件,在进行一些搜索之后,我编写了以下代码:
library(raster)
f <- list.files("inputFolder", pattern = "*.tif", full.names = TRUE)
r <- lapply(f, raster)
a <- lapply(r, writeRaster, filename = "output", format = "ascii")
Run Code Online (Sandbox Code Playgroud)
令我感到困惑的是,如何根据原始名称分别命名输出文件?
我试过了:
a <- lapply(r, writeRaster, filename = "outputFolder" + f, format = "ascii")
Run Code Online (Sandbox Code Playgroud)
但是我收到错误:
二进制运算符的非数字参数
然后我尝试了:
a <- lapply(r, writeRaster, filename = paste0(f, ".asc"), format = "ascii")
Run Code Online (Sandbox Code Playgroud)
但是我收到了:
file(filename,“ w”)中的错误:无效的'description'参数另外:警告消息:1:如果if(filename ==“”){:条件的长度> 1,则仅使用第一个元素2 :in if(!file.exists(dirname(filename))){:条件的长度> 1并且仅使用第一个元素3:In if(toupper(x @ file @ name)== toupper(filename) ){:条件的长度> 1,仅第一个元素将被使用4:In if(trim(filename)==“”){:条件的长度> 1,仅第一个元素将被使用5:In if(!file.exists(dirname(filename))){:条件的长度> 1,仅第一个元素将被使用6:in if(filename ==“”){:条件的长度> 1,且仅第一个元素将被使用7:在if(!overwrite&file.exists(filename)){中:条件的长度> 1,并且仅使用第一个元素
假设我有一个数据集(忘记分布):
modData <- data.frame("A" = rnorm(20, 15, 3),
"B" = rnorm(20, 20, 3),
"C" = rnorm(20, 25, 3),
"X" = rnorm(20, 5, 1)
)
Run Code Online (Sandbox Code Playgroud)
如果我分别X用作预测变量A、B和C响应:
md1 <- lm(A ~ X, data = modData)
md2 <- lm(B ~ X, data = modData)
md3 <- lm(C ~ X, data = modData)
Run Code Online (Sandbox Code Playgroud)
然后对每个模型进行 Shapiro 测试和 boxcox 测试,例如:
shapiro.test(residuals(md1))
boxcox(md1, plotit = T)
Run Code Online (Sandbox Code Playgroud)
有没有一种方便的方法来构建和测试多个模型而无需手动输入每个模型?