You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:34:54