我经常使用大型 3D 数组(纬度、经度和时间),例如 720x1440x480 的大小。通常,我需要对每个纬度和经度随时间进行操作,例如,获取平均值(导致 2D 数组)或及时获取滚动平均值(导致 3D 数组),或更复杂的函数。
我的问题是:哪种包装(或方式)最有效和最快?
我知道一个选项是基础 R,使用 apply 函数和滚动函数与提供 rollapply 函数的包 zoo 混合。另一种方式是使用 tidyverse,另一种方式是使用 data.table。以及这些包之间的组合。但有没有最快的?
例如,如果我有这个数据立方体:
data <- array(rnorm(721*1440*480),dim = c(721,1440,480))
Run Code Online (Sandbox Code Playgroud)
哪些维度是纬度、经度和时间,如下所示:
lat <- seq(from = -90, to = 90, by = 0.25)
lon <- seq(from = 0, to = 359.75, by = 0.25)
time <- seq(from = as.Date('1980-01-01'), by = 'month', length.out = 480)
Run Code Online (Sandbox Code Playgroud)
我通常需要做这样的事情(这是在基础 R + 动物园):
# Average in time
average_data <- apply(data, 1:2, mean)
# Rolling mean, width of window = …Run Code Online (Sandbox Code Playgroud) 我试过安装ncdf4包.我有R版3.1.1.
问题似乎是找到了nc-config.如果我谷歌针对这个特定的问题,那么我发现有相同问题的人,在安装libnetcdf-dev之前通过安装Debian软件包来解决它ncdf4.
我已经安装了该软件包,但我一直遇到同样的问题,
错误如下:
checking for nc-config... no
-----------------------------------------------------------------------------------
Error, nc-config not found or not executable. This is a script that comes with the netcdf library, version 4.1-beta2 or later, and must be present for configuration to succeed.
Run Code Online (Sandbox Code Playgroud) 我使用多维数组,当我需要绘图时,我通常将我的数据转换为 tibble through tbl_cube,然后用ggplot2. 今天新的dplyr 1.0.0更新到了CRAN,我发现现在tbl_cube已经不可用了。而且我找不到 tbl_cube 的替代品。我在今天之前做了类似这个玩具示例的事情来获得一个情节:
test_data1 <- array(1:50, c(5,5,2))
test_data2 <- array(51:100, c(5,5,2))
# list of my arrays
test_data <- list(exp1 = test_data1, exp2= test_data2)
# list of the dimentions
dims_list <- list(lat = 1:5, lon = 1:5, var = c('u','v'))
new_data <- as_tibble(tbl_cube(dimensions = dims_list, measures = test_data))
# Make some random plot
ggplot(new_data, aes(x=lon,y=lat)) +
geom_tile(aes(fill=exp2))+
geom_contour(aes(z=exp1),col='black')
Run Code Online (Sandbox Code Playgroud)
此示例运行并与以前的 dplyr 版本一起使用,但现在tbl_cube不再存在,因为不再存在。我知道在这个例子中,第三维不用于绘图,但我想表明我需要一些东西至少用于 3D 数组甚至 4D。
有关如何以简单的方式解决此问题的任何建议,例如tbl_cube?
我偶尔需要重命名因子变量的所有级别。我知道如何使用 R 基础来实现这一点,例如:levels(factor_variable) <- levels(new_variable)。但我真的很想有一种方法可以使用tidyverse. 我查看了一下dplyr,forcats但没有找到任何可以解决它的东西。我希望能够实现示例 1 中实现的目标,但需要与%>%操作员合作。
示例 1,使用 R 基(有效)
my_levels <- letters
sample_data <- data.frame(factor_data = factor(sample(my_levels,size = 500,replace = T) ,
levels = my_levels),
Any_other_data = rnorm(500))
my_new_levels <- rnorm(length(letters))
levels(sample_data$factor_data) <- levels(factor(my_new_levels))
Run Code Online (Sandbox Code Playgroud)
示例 2,我尝试过但不使用 tidyverse 的一件事
library(tidyverse)
my_levels <- letters
sample_data <- tibble(factor_data = factor(sample(my_levels,size = 500,replace = T) ,
levels = my_levels),
Any_other_data = rnorm(500))
my_new_levels <- rnorm(length(letters))
# Get error
sample_data <- sample_data …Run Code Online (Sandbox Code Playgroud)