r中的t.test错误

时间:2014-12-12 06:15:36

标签: r apply

我有一个包含6列的数据框。我累了在每一行上执行t.test,使用以下命令将第1列与第4 - 6列比较:

new.CL.10.ttest <- apply(new.CL, MARGIN = 1, function(m){
  t.test(x = m[1:3], y = m[4:6], alternative = 'two.sided')$p.value
})

我收到以下错误:

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

我可以告诉我如何解决这个问题吗?

以下是数据集的示例(非常长的列表的前3行)。数字实际上是花车,但为了简单起见我将它们四舍五入:

col1    col2    col3   col4     col5    col6
80      100     96     96       93      97
50      45      47     45       54      39
53      44      52     45       68      47

由于

1 个答案:

答案 0 :(得分:1)

假设特定行的数据集中没有变化

new.CL[2,] <- 45

使用您的代码,提供

#Error in t.test.default(x = m[1:3], y = m[4:6], alternative = "two.sided") : 
# data are essentially constant

我猜错误消息不同,因为您的原始数据行是floating numbers。使用rounded数据集,可以创建logical索引以删除原始/非基础数据集中的行。创建索引的一种方法是检查第一列是否等于数据集(new.CL[,1]==new.CL)中的所有列。由于recycling,它的作用是使用第一列检查elementwise每列。我们得到TRUE/FALSE的逻辑矩阵。在此矩阵中,某些行具有全部TRUE,即data在此基本上是常量。要消除这些行,请执行rowSums并检查它是否等于ncol(new.CL)

indx <- !rowSums(new.CL[,1]==new.CL)==ncol(new.CL)

 indx <- !!rowSums(new.CL[,1]!=new.CL)

new.Cl1 <- Orig.CL[indx,]

数据

new.CL <- structure(list(col1 = c(80L, 50L, 53L), col2 = c(100L, 45L, 44L
), col3 = c(96L, 47L, 52L), col4 = c(96L, 45L, 45L), col5 = c(93L, 
54L, 68L), col6 = c(97L, 39L, 47L)), .Names = c("col1", "col2", 
"col3", "col4", "col5", "col6"), class = "data.frame", row.names = c(NA, 
-3L))