在 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 行,我们有 first
值 X
和 Y
和 mean
值 Elevation
。
因为您有一个大型数据集,所以使用 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)
我有一个组合数据框,其中包含来自美国 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 行,我们有 first
值 X
和 Y
和 mean
值 Elevation
。
因为您有一个大型数据集,所以使用 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)