在 R 中调整数据框的大小

Resizing dataframe in R

我有一个组合数据框,其中包含来自美国 SRTM 的高程数据。但是,我的数据框的总大小是 115200000 行。在绘制“'Error: vector memory exhausted (limit reached?)'”时,此数据量会产生错误。因此我想调整它的大小。这是我的数据框的副本:

structure(list(X = c(-139.995833333333, -139.9875, -139.979166666667, 
-139.970833333333, -139.9625, -139.954166666667, -139.945833333333, 
-139.9375, -139.929166666667, -139.920833333333, -139.9125, -139.904166666667, 
-139.895833333333, -139.8875, -139.879166666667, -139.870833333333, 
-139.8625, -139.854166666667, -139.845833333333, -139.8375), 
    Y = c(89.9958333333333, 89.9958333333333, 89.9958333333333, 
    89.9958333333333, 89.9958333333333, 89.9958333333333, 89.9958333333333, 
    89.9958333333333, 89.9958333333333, 89.9958333333333, 89.9958333333333, 
    89.9958333333333, 89.9958333333333, 89.9958333333333, 89.9958333333333, 
    89.9958333333333, 89.9958333333333, 89.9958333333333, 89.9958333333333, 
    89.9958333333333), Elevation = c(0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, 20L
), class = "data.frame")

这是 20 行。例如,我如何调整它的大小,使其只有 4 行,这是每 5 行的平均值?

希望你能帮帮我!

你可以试试这个方法:

library(dplyr)

n <- 5

df %>%
  group_by(grp = ceiling(row_number()/n)) %>%
  summarise(across(c(X, Y), first), 
            Elevation = mean(Elevation, na.rm = TRUE)) %>%
  select(-grp) -> result

result

对于每 5 行,我们有 firstXYmeanElevation


因为您有一个大型数据集,所以使用 data.table 将是有益的:

library(data.table)

setDT(df)[, .(Elevation = mean(Elevation, na.rm = TRUE), 
              X = first(X), 
              Y = first(Y)), ceiling(seq_len(nrow(df))/n)]

您可以使用 aggregate.

aggregate(x, list(seq(0, length.out = nrow(x)) %/%5), FUN=mean)
#  Group.1         X        Y Elevation
#1       0 -139.9792 89.99583         0
#2       1 -139.9375 89.99583         0
#3       2 -139.8958 89.99583         0
#4       3 -139.8542 89.99583         0

我们可以使用 base R 中的 gl 创建分组列

library(dplyr)
n <- 5
df1 %>%
    group_by(grp = as.integer(gl(n(), n, n()))) %>% 
    summarise(across(c(X, Y), first), 
         Elevation = mean(Elevation, na.rm = TRUE), .groups = 'drop') %>% 
    select(-grp)