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

R语言执行fisher.test报错:all entries of 'x' must be nonnegative and finite

问题描述

我不熟悉R语言,正在帮朋友做统计分析。已经筛选出目标数据,用dim()函数确认是二维矩阵,代码和数据如下:

library(data.table)
data = fread(myFILE, header = FALSE, select = c(9,46))

dim(data)
# [1] 68  2

print(data)
> print(d)
     V9          V46
 1: Question1 ? Question2 ?
 2: 30          No
 3: 25          Yes
 4: 24          Yes
 5: 25          Yes
 6: 27          Yes
 7: 27          Yes
 8: 25          Yes
 9: 26          Yes
10: 25          Yes
11: 24          Yes
12: 26          No
13: 24          Yes
14: 27          Yes
15: 26          Yes
16: 26          Yes
17: 26          Yes
18: 27          Yes
19: 26          Yes

data = d[-1,] # 移除首行的问题描述

fisher.test(data)
Error in fisher.test(data) : 
  all entries of 'x' must be nonnegative and finite

移除首行问题描述后,运行fisher.test(data)出现上述错误。请问我遗漏了什么?是否需要把Yes/No转成1/0?


问题解答
  • 变量名错误:你用data = fread(...)读取数据,但后续写了data = d[-1,],这里d是未定义的变量,应该改成data = data[-1,],否则当前的data并不是处理后的正确数据集。
  • Fisher检验的输入不符合要求:fisher.test()需要的是列联表,而非原始的两列数据。你当前的第一列是连续/离散数值(年龄类数据),第二列是分类变量(Yes/No),直接传入整个数据框会报错。

正确操作步骤:

  1. 修正变量名,确保处理正确的数据:
    data = data[-1,] # 替换原代码中的d[-1,]
    
  2. 将第一列的数值变量转化为分类分组(比如按年龄区间划分),再生成列联表:
    # 把V9列转为数值型并分组,示例以25岁为界限
    data$V9 = as.numeric(data$V9)
    data$age_group = ifelse(data$V9 <=25, "≤25岁", ">25岁")
    # 生成列联表
    ct = table(data$age_group, data$V46)
    # 执行Fisher精确检验
    fisher.test(ct)
    
  3. Yes/No不需要转为1/0,table()函数可直接识别字符型分类变量,但要确保V46列无缺失值或异常字符。

内容的提问来源于stack exchange,提问作者Biscuit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:27:27