【问题标题】:R statistics: problem with simple column vectorR统计:简单列向量的问题
【发布时间】:2025-11-23 12:40:02
【问题描述】:

我在使用通过read.delim 导入的制表符分隔数据文件中的数据时遇到问题。

大多数列都包含我需要为它们执行t.test 的数字数据。不幸的是,我总是收到此错误:

Error in if (stderr < 10 * .Machine$double.eps * max(abs(mx), abs(my))) 
            stop("data are essentiallyconstant") :
missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In mean.default(x) : argument is not numeric or logical: returning NA
2: In mean.default(y) : argument is not numeric or logical: returning NA

我注意到这只发生在包含不同级别的向量上。 它甚至不会对水平向量执行简单的数值运算,例如 vector[1] + vector[2]。 不过,没有级别的向量可以正常工作。

如何使用水平向量中的数据进行计算?

谢谢

【问题讨论】:

  • 玩具数据的可重现示例,请。另外,如果可以,请尝试使用“1010101”按钮格式化您的代码。

标签: r statistics


【解决方案1】:

您的某些数据在加载后可能不是数字格式。使用str(your.data) 检查数据结构。如果您想要的变量不是数字,您可以使用data$var1 &lt;- as.numeric(data$var1) 转换它们。

【讨论】:

  • 是的 - “水平向量”对我来说听起来很像一个因素。在 read.delim 上,您可以将 stringsAsFactors 参数设置为 FALSE,这将防止这种情况发生。还有一个全局 stringsAsFactors 选项(如果您查看?read.delim,您可以看到默认值选中此选项)。我强烈推荐它。
  • 另请参阅关于将因子转换为数字的 R 常见问题解答(裸 as.numeric 不起作用)。 cran.r-project.org/doc/FAQ/…
【解决方案2】:

我已经能够通过以下小示例重现您的错误消息:

x = as.factor(1:5)
y = as.factor(1:5)

t.test(x, y)

产量

Error in if (stderr < 10 * .Machine$double.eps * max(abs(mx), abs(my))) stop("data are essentially constant") : 
  missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In mean.default(x) : argument is not numeric or logical: returning NA
2: In mean.default(y) : argument is not numeric or logical: returning NA

问题是您正在尝试对非数字向量执行 t 检验。同样没有为因子定义加法:

x + y

产量

[1] NA NA NA NA NA
Warning message:
In Ops.factor(x, y) : + not meaningful for factors

警告提供了关于哪里出了问题的敏锐洞察力,并解释了为什么您的 t 检验不起作用。

要解决此问题,您需要按照 ilya 的建议进行操作:使用 as.numeric(as.character()) 将向量转换为数字

【讨论】:

  • 真正的解决方案是首先找出为什么你的数字向量被转换为因子。
  • 非常感谢。使用 as.numeric(as.character(vector)) 将水平向量转换为数字解决了这个问题。事实上,水平向量中的条目是因子。
【解决方案3】:

您说“大多数列都包含数字数据”。那就是问题所在。只有当所有列都包含数值数据时,才能在不改变数据类型的情况下应用函数。如果其他列有非数值数据,则应在函数apply中更改数据类型:

        pvalue<-apply(x,1,ttest<-function(tmp { 
                              if(length(unique(c(tmp[5],tmp[7],tmp[9])))!=1 && 
                              length(unique(c(tmp[11],tmp[13],tmp[15])))!=1) 
                              t.test(c(as.numeric(tmp[5]),as.numeric(tmp[7]),
                              as.numeric(tmp[9])), c(as.numeric(tmp[11]), 
                              as.numeric(tmp[13]),as.numeric(tmp[15])))$p.value 
                              else NA})

【讨论】: