R语言填充四维数组时出现数据缺失问题求助
问题描述
我正尝试用for循环将长格式数据框转换为四维数组,每个鸟类物种对应年份/样地/重复矩阵,用于多季节物种占用率建模。改编自某R包vignette后,循环填充检测(1)/未检测(0)数据时,输出数组全为NA,且各物种计数为0。
数据集为长格式,已提取物种、样地、年份编码,创建了维度为[物种数N, 样地数J, 年份数I, 最大重复数K]的数组,但填充后无有效数据。
初始代码如下:
library(dplyr) # 导入数据(假设已完成) # y.long <- read.csv("y.long.csv") # 提取编码与维度参数 sp.codes <- sort(unique(y.long$Species)) plot.codes <- sort(unique(y.long$Plot)) year.codes <- sort(unique(y.long$Year)) N <- length(sp.codes) K <- 10 J <- length(plot.codes) I <- length(year.codes) # 创建四维数组 y <- array(NA, dim = c(N, J, I, K)) dimnames(y)[[1]] <- sp.codes dimnames(y)[[2]] <- plot.codes dimnames(y)[[3]] <- year.codes # 填充数组的循环 for (i in 1:I) { # 遍历年份 for (j in 1:J) { # 遍历样地 for (k in 1:K) { # 遍历重复 curr.df <- y.long %>% filter(Year == I[i], Plot == J[j], Replicate == K[k]) if (nrow(curr.df) > 0) { curr.sp <- which(sp.codes %in% curr.df$Species) y[curr.sp, i, j, k] <- 1 y[-curr.sp, i, j, k] <- 0 } } } } # 验证结果 str(y) apply(y, 1, sum, na.rm = TRUE)
运行后数组仍全为NA,物种计数均为0。
问题分析与解决方案
核心错误点
- 筛选条件错误:循环中用维度数量(
I[i]、J[j]、K[k])替代了实际的年份/样地/重复值,导致无法匹配数据。例如I是年份的数量(4),I[i]取的是1-4,而实际年份是2008、2010等,完全不匹配。 - 数组索引顺序错误:创建数组时维度为
[N, J, I, K](物种、样地、年份、重复),但赋值时用了y[curr.sp, i, j, k],把年份索引i放在了样地的位置,导致数据写入了错误的维度位置。
修正后的代码
library(dplyr) # 导入数据 y.long <- read.csv("y.long.csv") # 提取编码与维度参数 sp.codes <- sort(unique(y.long$Species)) plot.codes <- sort(unique(y.long$Plot)) year.codes <- sort(unique(y.long$Year)) N <- length(sp.codes) K <- 10 J <- length(plot.codes) I <- length(year.codes) # 创建四维数组 y <- array(NA, dim = c(N, J, I, K)) dimnames(y)[[1]] <- sp.codes dimnames(y)[[2]] <- plot.codes dimnames(y)[[3]] <- year.codes dimnames(y)[[4]] <- as.character(1:K) # 给重复维度添加名称 # 修正后的填充循环 for (i in 1:I) { # 遍历年份索引 current_year <- year.codes[i] for (j in 1:J) { # 遍历样地索引 current_plot <- plot.codes[j] for (k in 1:K) { # 遍历重复次数 # 筛选当前年份、样地、重复的数据 curr.df <- y.long %>% filter(Year == current_year, Plot == current_plot, Replicate == k) if (nrow(curr.df) > 0) { # 找到观测到的物种索引 curr.sp <- which(sp.codes %in% curr.df$Species) # 按正确的维度索引赋值:[物种, 样地, 年份, 重复] y[curr.sp, j, i, k] <- 1 y[-curr.sp, j, i, k] <- 0 } } } } # 验证结果 str(y) apply(y, 1, sum, na.rm = TRUE)
关键修正说明
- 筛选时使用
year.codes[i]、plot.codes[j]、k,匹配数据中的实际年份、样地编号和重复次数; - 赋值时调整索引顺序为
y[curr.sp, j, i, k],对应数组的[物种, 样地, 年份, 重复]维度; - 给重复维度添加名称,让数组结构更清晰,与目标示例一致。
内容的提问来源于stack exchange,提问作者Rion Lerm
相关产品推荐
相关产品推荐

