2016-01-17 56 views
1

我有一個data.frame df> 110 000行。它看起來像:R - 使用shapiro.test()應用於數字矩陣給出的錯誤:所有的'x'值是相同的

traking_id   A1_CTRL  A2_CTRL  A3_CTRL  A4_CTRL  A5_CTRL  A1_DEX  A2_DEX  A3_DEX  A4_DEX  A5_DEX 
1 ENSMUST00000000001 1.35358e+01 1.03390e+01 1.03016e+01 1.12654e+01 1.22707e+01 1.40684e+01 9.15279e+00 1.17276e+01 1.14550e+01 1.46256e+01 
2 ENSMUST00000000003 5.01868e-06 5.59107e-06 1.60922e-01 2.45402e-01 2.18614e-01 2.24124e-01 2.88035e-01 7.18876e-06 1.74746e-06 0.00000e+00 
... 

我感興趣的執行shapiro.test兩次,每次行 - 一次在第2列的值:6,一次在列7:11值。

我想獲得兩個函數shapiro.test返回的對象列表,以便從中提取p.value列。我想通過使用功能適用於做,但我的代碼

shapiro.test_CTRL <- apply(data.matrix(df[,2:6]), 1, shapiro.test) 

返回一個錯誤

Error in FUN(newX[, i], ...) : all 'x' values are identical 

然而,當我使用pearson.test一切正常:

pearson.test_CTRL <- apply(data.matrix(df[,2:6]), 1, pearson.test) 

計算shapiro.test只是一行也可以正常工作:

shapiro.test(data.matrix(x[1,2:6])) 

我想知道爲什麼使用適用於shapiro.test的方式導致錯誤以及如何正確執行它?

回答

1

如果你看看源shapiro.test它有這樣一行:

... 
     x <- sort(x[complete.cases(x)]) 
     n <- length(x) 
     if (is.na(n) || n < 3L || n > 5000L) 
      stop("sample size must be between 3 and 5000") 
     rng <- x[n] - x[1L] 
     if (rng == 0) 
      stop("all 'x' values are identical") 
... 

此錯誤是觸發你行的值都是一樣的。同樣的錯誤可以使用此代碼被觸發:

f <- function(x) { 
    if (diff(range(x)) == 0) list() else shapiro.test(x) 
} 

apply(mtcars[,2:5], 1, f) 

mtcars[2,] <- 1 
apply(mtcars[,2:5], 1, shapiro.test) 

您可以通過測試該條件和返回別的避免這個錯誤

相關問題