我有一个包含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
由于
答案 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))