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),直接传入整个数据框会报错。
正确操作步骤:
- 修正变量名,确保处理正确的数据:
data = data[-1,] # 替换原代码中的d[-1,] - 将第一列的数值变量转化为分类分组(比如按年龄区间划分),再生成列联表:
# 把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) - Yes/No不需要转为1/0,
table()函数可直接识别字符型分类变量,但要确保V46列无缺失值或异常字符。
内容的提问来源于stack exchange,提问作者Biscuit
相关产品推荐
相关产品推荐

