【问题标题】:Why lapply works and apply doesn't?为什么 lapply 有效而 apply 无效?
【发布时间】:2020-01-15 10:40:11
【问题描述】:

我的数据:

 df_1 <- data.frame(
      x = replicate(
        n = 3, 
        expr = runif(n = 30, min = 20, max = 100)
      ), 
      y = sample(
        x = 1:3, size = 30, replace = TRUE
      )
    )

lapply 的以下代码有效:

lapply(X = names(df_1)[c(1:3)], FUN = function(x) {
  pairwise.t.test(
    x = df_1[, x], 
    g = df_1[['y']], 
    p.adj = 'bonferroni'
  )
})

但是,apply 不会:

apply(X = names(df_1)[c(1:3)], MARGIN = 2, FUN = function(x) {
  pairwise.t.test(
    x = df_1[, x], 
    g = df_1[['y']], 
    p.adj = 'bonferroni'
  )
})

应用错误(X = 名称(df_1)[c(1:3)], MARGIN = 2, FUN = function(x) { : dim(X) 的长度必须为正

为什么会出现问题?它们不相等吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    对于应用,您应该改为使用

    apply(X = df_1[1:3], MARGIN = 2, FUN = function(x) {
        pairwise.t.test(
        x = x, 
        g = df_1[['y']], 
        p.adj = 'bonferroni'
     )
    })
    

    那是因为来自?apply

    如果 MARGIN 的长度为 1,apply 返回一个向量,否则返回一个维度为 dim(X)[MARGIN] 的数组。

    在您的尝试中,您使用 names(df_1)[c(1:3)] 作为 apply 的参数,它有

    dim(names(df_1)[c(1:3)])[2]
    #NULL
    

    因此,您会收到错误消息。

    【讨论】:

    • 为什么要这样做?谢谢回答。
    • @neves 添加了解释。
    猜你喜欢
    • 2020-03-09
    • 2011-07-05
    • 2012-01-15
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多