使用dplyr将R语言data.frame转换为层级化多维数组
解决方案
首先注意你的示例数据中,cbind会将所有列转换为字符型,所以第一步需要先把AB列转为数值型,否则最终数组会存储字符而非数值:
DATA$AB <- as.numeric(DATA$AB)
接下来可以直接用xtabs()函数生成符合你要求的5维数组,它会自动根据指定的维度交叉组合生成数组,维度顺序完全匹配你需要的[PLACE,SP,YEAR,PROJECT,BIOME]:
# 生成多维数组,公式格式为 数值列 ~ 维度列1 + 维度列2 + ... array_result <- xtabs(AB ~ PLACE + SP + YEAR + PROJECT + BIOME, data = DATA)
验证结果
- 查看数组维度:
dim(array_result) # 输出:10 2 2 5 2 # 对应PLACE(10个水平)、SP(2个)、YEAR(2个)、PROJECT(5个)、BIOME(2个)
- 查看各维度的名称:
dimnames(array_result)
- 验证特定位置的取值是否正确:
# 比如检查Gu.1采样点、sp.1物种、2016年、Gurupi项目、AM生物群系的丰度 array_result["Gu.1", "sp.1", "2016", "Gurupi", "AM"] # 输出:3
自定义维度顺序(可选)
如果你的实际数据中各维度的水平顺序不符合预期,可以提前将列转换为因子并指定levels参数,比如:
# 按指定顺序设置PROJECT的水平 DATA$PROJECT <- factor(DATA$PROJECT, levels = c("Gurupi", "Juruena", "Veracel", "Ipanema", "Caima")) # 再重新生成数组 array_result <- xtabs(AB ~ PLACE + SP + YEAR + PROJECT + BIOME, data = DATA)
这样生成的数组就会严格按照你指定的维度顺序排列。
内容的提问来源于stack exchange,提问作者Ricardo Sampaio
相关产品推荐
相关产品推荐

