R语言gawdis函数报错:names属性长度与向量不匹配求助
解决gawdis函数计算Gower距离的报错问题
问题背景
硕士生态学作业要求:
- 使用FD包的
tussock数据集,选择8个性状:height、LDMC、leafN、leafS、leafP、SLA、raunkiaer、pollination - 将定量数据转换为对数尺度以控制方差
- 用
gawdis函数计算Gower距离,指定LDMC、leafN、leafS、leafP、SLA为同一叶性状组
前序代码运行正常,但调用gawdis时出现报错。
原代码
library(FD) library(gawdis) library(ade4) library(dplyr) # 加载数据 data("tussock") str(tussock) # 提取群落矩阵 dim(tussock$abun) head(tussock$abun) comm <- tussock$abun head(comm) class(comm) # 提取性状矩阵 tussock$trait head(tussock$trait) traits <- tussock$trait class(tussock$abun) class(tussock$trait) # 选择目标性状 traits2 <- traits[, c("height", "LDMC", "leafN", "leafS", "leafP", "SLA", "raunkiaer", "pollination")] head(traits2) # 移除指定物种 traits2 <- traits2[!rownames(traits2) %in% c("Cera_font", "Pter_veno"),] traits2 # 定量数据转对数尺度 traits2 <- traits2 |> mutate_if(is.numeric, log) # 计算Gower距离 gaw_groups <- gawdis::gawdis (traits2, groups.weight = T, groups = c("LDMC", "leafN", "leafS", "leafP", "SLA")) attr(gaw_groups, "correls")
报错信息
Error in names(w3) <- dimnames(x)[[2]] : 'names' attribute [8] must be the same length as the vector [5] In addition: Warning message: In matrix(rep(w, nrow(d.raw)), nrow = p, ncol = nrow(d.raw)) : data length [6375] is not a sub-multiple or multiple of the number of rows [8]
报错原因
gawdis函数的groups参数要求是与性状列数长度一致的向量,每个元素对应一列性状的组标签,而非仅列出某一组内的性状名称。原代码中groups只传入了5个叶性状名称,而traits2有8列性状,长度不匹配导致报错。
解决方案
构造长度为8的组标签向量,将LDMC、leafN、leafS、leafP、SLA标记为同一组(比如"leaf_traits"),其余性状各为单独组:
修正后的代码
library(FD) library(gawdis) library(ade4) library(dplyr) # 加载数据 data("tussock") str(tussock) # 提取群落矩阵 dim(tussock$abun) head(tussock$abun) comm <- tussock$abun head(comm) class(comm) # 提取性状矩阵 tussock$trait head(tussock$trait) traits <- tussock$trait class(tussock$abun) class(tussock$trait) # 选择目标性状 traits2 <- traits[, c("height", "LDMC", "leafN", "leafS", "leafP", "SLA", "raunkiaer", "pollination")] head(traits2) # 移除指定物种 traits2 <- traits2[!rownames(traits2) %in% c("Cera_font", "Pter_veno"),] traits2 # 定量数据转对数尺度 traits2 <- traits2 |> mutate_if(is.numeric, log) # 构造组标签向量:8个元素对应8列性状 group_labels <- c("height", "leaf_traits", "leaf_traits", "leaf_traits", "leaf_traits", "leaf_traits", "raunkiaer", "pollination") # 计算Gower距离 gaw_groups <- gawdis::gawdis(traits2, groups.weight = TRUE, groups = group_labels) attr(gaw_groups, "correls")
内容的提问来源于stack exchange,提问作者Jonas Rosa
相关产品推荐
相关产品推荐

