【问题标题】:R - using apply on numeric matrix with shapiro.test() gives error: all 'x' values are identicalR - 对带有 shapiro.test() 的数字矩阵使用 apply 会产生错误:所有“x”值都是相同的
【发布时间】:2019-01-24 00:02:39
【问题描述】:

我有一个超过 110 000 行的 data.frame df。看起来是这样的:

  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 列。我想通过使用函数 apply 来做到这一点,但是我的代码

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]))

我想知道为什么以我的方式将 apply 与 shapiro.test 一起使用会导致错误以及如何正确执行?

【问题讨论】:

    标签: r


    【解决方案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")
    ...
    

    触发此错误是因为您的行的值都相同。使用此代码可以触发相同的错误:

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

    您可以通过测试该条件并返回其他内容来避免此错误:

    f <- function(x) {
      if (diff(range(x)) == 0) list() else shapiro.test(x)
    }
    
    apply(mtcars[,2:5], 1, f)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2014-04-19
      • 2021-12-29
      • 2018-10-10
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      相关资源
      最近更新 更多