如何在R语言中从DataFrame创建指定维度的四维数组?
在R中从多变量DataFrame创建四维数组
实现步骤
要构建符合num_ids * num_variables * num_months * num_years维度的数组,需先整合多变量数据集、明确各维度的有序取值,再完成数组填充,具体操作如下:
1. 修正并准备示例数据
注意:cbind()返回的是字符矩阵,需转换为数据框并确保数值列类型正确。同时模拟第二个变量的数据集(对应你提到的多个结构相同的数据集):
# 第一个变量(km)的数据集 ids <- c(1:8) months <- c('10','11','12','01','02','10','11','12') years <- c('2019','2020','2021','2022','2019','2020','2021','2022') km <- c(3456, 54654, 76765, 57676, 8689, 87989, 8632, 42325) df_km <- data.frame(ids, months, years, km = as.numeric(km)) # 模拟第二个变量(fuel)的数据集 fuel <- c(120, 450, 600, 520, 150, 780, 100, 380) df_fuel <- data.frame(ids, months, years, fuel = as.numeric(fuel))
2. 整合多变量数据集为长格式
将多个变量的数据集合并,并转换为长格式,方便后续映射到数组维度:
library(dplyr) library(tidyr) # 合并并转长格式 combined_df <- bind_rows( df_km %>% pivot_longer(cols = km, names_to = "variable", values_to = "value"), df_fuel %>% pivot_longer(cols = fuel, names_to = "variable", values_to = "value") )
3. 定义各维度的有序取值
明确数组四个维度的唯一值,注意月份需按实际时间顺序排序(而非字符串字典序):
# 各维度的有序唯一值 unique_ids <- sort(unique(combined_df$ids)) unique_vars <- unique(combined_df$variable) # 按1-12月顺序排列月份 unique_months <- c('01','02','10','11','12') unique_years <- sort(unique(combined_df$years))
4. 创建并填充四维数组
先初始化带维度名称的空数组,再通过循环将数据映射到对应位置:
# 初始化四维数组 four_d_array <- array( data = NA, dim = c(length(unique_ids), length(unique_vars), length(unique_months), length(unique_years)), dimnames = list( id = unique_ids, variable = unique_vars, month = unique_months, year = unique_years ) ) # 填充数组内容 for (i in seq_len(nrow(combined_df))) { row_data <- combined_df[i, ] # 找到当前行对应各维度的索引 id_pos <- which(unique_ids == row_data$ids) var_pos <- which(unique_vars == row_data$variable) month_pos <- which(unique_months == row_data$months) year_pos <- which(unique_years == row_data$years) # 赋值到数组对应位置 four_d_array[id_pos, var_pos, month_pos, year_pos] <- row_data$value }
5. 验证结果
可以通过以下方式查看数组结构和内容:
# 查看数组维度 dim(four_d_array) # 查看id=1、变量km的所有月份-年份数据 four_d_array["1", "km", , ]
内容的提问来源于stack exchange,提问作者virginia_wolff
相关产品推荐
相关产品推荐

