【问题标题】:Using apply in R在 R 中使用应用
【发布时间】:2015-07-22 10:00:00
【问题描述】:

我有一个数字矩阵,我想从每列中获取 5 个最低(最小值)元素的平均值。 我正在尝试使用可用的不同应用功能之一。但我做不到。

这是我需要应用的函数,我已经用 for 循环对其进行了测试,效果很好。

   mean(head(sort(table[,x]),5))

这是我尝试过的几个示例之一:

   a<-mapply(function(x){mean(head(sort(table[,x]),5))},table)

我收到以下错误:

   Error in `[.data.frame`(x, order(x, na.last = na.last, decreasing = decreasing)) :   undefined columns selected 

我也尝试过 sapply、lapply……但我还没有成功。找不到任何依据,上网冲浪..

提前致谢

【问题讨论】:

  • apply(df, 2, function(x) mean(sort(x, decreasing = F)[1:5]))

标签: r matrix lapply sapply mapply


【解决方案1】:

您最简单的猜测是在这里应用,因为您想按列应用。有一些样本数据:

set.seed(123)
df = matrix(rnorm(100), 10, 10)

这将起作用:

apply(df, 2, function(x) mean(sort(x, decreasing = F)[1:5]))

这段代码在做什么?

  • 应用的第一个参数是数据,这里是df(在你的问题中你称之为table)。
  • 第二个参数2 表示函数应用于每一列。还有1 用于行,c(1,2) 用于两者。
  • 第三个参数是你的函数。由于这不是微不足道的,因此最好在原地定义它,即定义 x 的函数(将 x 想象为数据框/矩阵的一列),然后取前 5 个中的 mean sort 的元素(索引 [1:5])。您还可以看到如何将更多参数传递给函数(例如,decreasing = FALSE 诚然这是默认行为,但假设您想要 5 个最高值的平均值)。如果您缺少数据,您可能需要将na.rm = TRUE 作为参数添加到mean

这是你的输出:

> apply(df, 2, function(x) mean(sort(x, decreasing = F)[1:5]))
 [1] -0.6376458 -0.5049506 -1.1295099 -0.1233905 -0.7905504 -0.3444174 -0.5745786 -1.0836254 -0.1159064 -0.4503110

【讨论】:

  • 谢谢先生,非常好的解释。我不明白第二个论点,我认为那是让我更麻烦的一个。
【解决方案2】:

你在找colMeans,让代码更简洁:

colMeans(head(apply(m, 2, sort),5))

【讨论】:

    【解决方案3】:

    试试这个:

    set.seed(1)
    (mat <- matrix(sample(1:12, 12), ncol = 3))
    #      [,1] [,2] [,3]
    # [1,]    4    2    3
    # [2,]    5    7    1
    # [3,]    6   10   11
    # [4,]    9   12    8
    n <- 2
    apply(mat, 2, function(x) mean(head(sort(x), n)))
    # [1] 4.5 4.5 2.0
    

    【讨论】:

      【解决方案4】:

      尝试使用应用:

      a<-apply(table,2,function(x){mean(head(sort(x),5))})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-27
        • 1970-01-01
        • 1970-01-01
        • 2018-08-21
        • 2013-12-19
        • 1970-01-01
        相关资源
        最近更新 更多