R中ade4包acm.disjonctif()函数报错:Error in 1:ncol(df) : argument of length 0
问题:使用ade4包的
acm.disjonctif()转换因子列时出错 问题背景
我有一个数据框data_genus,其中包含无缺失值的geology列,想要用ade4包的acm.disjonctif()函数将其转换为指示变量,但执行代码时持续报错。
报错代码与错误信息
第一次执行的代码:
library(ade4) indic_geology = acm.disjonctif(data_genus$geology)
得到错误:
Error in 1:ncol(df) : argument of length 0
之后尝试将列转为因子:
data_genus$geology = as.factor(data_genus$geology) indic_geology = acm.disjonctif(data_genus$geology)
仍然出现相同错误。
列数据情况
data_genus$geology已转为因子,具体内容如下:
data_genus$geology [1] 3 6 6 5 6 3 3 3 2 3 5 6 3 5 1 6 6 1 3 6 3 1 5 6 1 5 6 5 5 6 5 1 1 1 5 5 6 1 1 5 3 3 5 [44] 6 3 5 6 3 3 5 1 3 3 6 5 3 6 6 3 6 6 3 6 6 6 6 6 6 3 3 3 6 2 3 3 1 6 2 1 6 5 3 2 3 1 6 [87] 1 2 6 6 3 2 3 6 5 5 5 6 5 3 6 6 3 3 6 5 5 6 5 6 2 3 3 5 3 3 5 6 6 6 5 5 1 2 5 6 3 6 6 [130] 1 5 3 6 3 3 5 3 5 1 3 5 2 5 5 5 6 3 3 5 5 3 5 3 6 6 3 3 5 3 2 6 5 3 3 3 3 6 3 6 5 6 5 [173] 6 3 6 6 6 6 3 3 3 6 6 6 3 3 5 3 6 6 5 6 3 1 6 6 5 6 5 6 5 6 3 3 6 5 6 5 6 5 3 5 6 6 5 [216] 6 3 3 5 6 6 6 3 6 3 1 2 1 3 3 6 6 3 1 3 3 6 6 1 6 5 1 1 6 6 2 3 6 6 3 3 1 6 5 1 3 6 6 [259] 3 3 6 6 3 1 6 6 5 3 2 6 5 5 2 6 6 2 6 3 6 3 3 2 5 6 6 3 6 3 3 3 1 5 6 6 6 3 5 5 5 1 2 [302] 5 6 6 6 3 3 3 6 6 3 3 6 1 5 6 6 5 3 3 1 6 6 6 5 2 3 3 5 3 6 6 2 3 6 1 3 3 3 6 6 3 3 3 [345] 2 3 5 3 5 1 6 5 5 6 6 6 5 3 2 6 3 5 1 6 3 1 1 6 5 1 1 6 6 2 6 2 2 6 3 6 6 1 3 3 3 2 5 [388] 3 3 6 6 2 6 6 6 1 6 6 3 3 3 3 2 6 3 6 6 1 5 6 6 6 3 1 5 2 3 3 5 3 6 6 5 6 6 6 6 5 1 1 [431] 1 6 6 6 5 5 3 3 6 5 3 5 3 5 2 5 5 6 5 1 5 3 1 5 3 3 6 3 6 6 6 6 6 6 6 1 3 6 3 6 3 6 6 [474] 6 5 3 3 5 6 6 2 3 6 6 5 6 5 5 5 5 6 3 2 5 1 3 5 5 3 6 5 1 5 6 6 3 6 3 3 3 1 5 3 3 2 5 [517] 6 3 6 3 3 3 6 3 6 6 6 5 6 6 1 6 3 6 1 3 3 1 6 5 2 6 3 6 6 3 1 6 3 2 5 5 6 6 2 3 3 5 6 [560] 2 6 6 6 6 6 2 6 5 5 1 6 3 6 1 3 6 1 2 5 6 5 2 5 1 5 6 6 5 5 6 5 1 6 1 6 6 1 3 6 3 2 5 [603] 6 5 5 6 3 3 3 6 3 1 2 5 5 3 6 3 2 6 3 3 6 5 6 1 6 3 3 6 2 6 3 6 6 3 3 3 3 1 3 6 3 5 3 [646] 3 1 3 3 1 2 1 6 5 3 3 6 3 6 3 3 5 6 5 2 5 6 5 2 3 5 5 6 6 3 5 6 1 3 6 6 5 5 3 2 5 6 5 [689] 5 1 5 1 2 6 3 2 3 6 5 5 6 6 6 5 6 3 3 5 5 6 1 5 5 1 6 5 6 1 3 6 6 5 5 6 2 1 3 6 5 5 5 [732] 5 5 5 1 6 1 6 3 5 2 1 3 3 5 3 3 6 6 2 1 6 3 6 1 5 6 1 3 6 6 6 6 3 1 6 1 6 6 3 1 6 5 3 [775] 6 1 6 5 6 3 6 6 3 5 5 6 6 3 3 5 3 1 3 5 3 5 6 6 6 3 6 5 1 3 1 5 3 2 2 3 6 1 6 3 6 5 3 [818] 1 3 2 1 3 6 6 3 6 3 5 6 3 6 5 6 3 3 6 3 3 3 6 5 5 6 6 3 3 3 3 6 3 6 3 6 6 6 6 1 6 6 6 [861] 6 3 5 2 3 5 3 3 3 6 5 2 1 6 6 3 6 3 6 6 6 3 5 6 6 6 3 3 3 5 5 2 6 6 3 5 3 3 6 6 3 1 5 [904] 5 3 3 5 2 3 3 3 1 6 3 1 3 3 6 6 6 1 3 6 3 6 3 6 3 3 6 6 3 5 5 6 3 3 3 5 3 6 3 3 3 1 5 [947] 6 6 1 6 5 5 5 3 5 3 6 2 3 6 3 3 2 3 1 5 1 6 3 1 6 1 3 6 5 6 6 5 1 5 3 6 5 6 6 6 6 6 1 [990] 5 6 6 3 5 5 3 3 6 5 5 1 Levels: 1 2 3 5 6
解决方案
问题核心是acm.disjonctif()要求输入为数据框,而非单独的向量(即使是因子向量也不满足要求)。可以通过以下两种方法解决:
- 方法一:将目标列包装成数据框传入
indic_geology = acm.disjonctif(data.frame(geology = data_genus$geology))
- 方法二:直接从原数据框中提取保留数据框结构的列
indic_geology = acm.disjonctif(data_genus[, "geology", drop = FALSE])
执行上述代码后,会生成对应因子水平的指示变量矩阵:每个因子水平对应一列,样本属于该水平时取值为1,否则为0。
内容的提问来源于stack exchange,提问作者Mimi
相关产品推荐
相关产品推荐

