在 R 中使用应用
Using apply in R
我有一个数字矩阵,我想从每列中获取 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...但我还没有成功。找不到任何依据,网上冲浪..
提前致谢
试试这个:
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
尝试使用应用:
a<-apply(table,2,function(x){mean(head(sort(x),5))})
你最简单的猜测是在这里应用,因为你想按列应用。使用一些示例数据:
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 想象为 dataframe/matrix 的一列),然后使用
mean
sort
的前 5 个元素(索引 [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
您正在寻找colMeans
,使代码更紧凑:
colMeans(head(apply(m, 2, sort),5))
我有一个数字矩阵,我想从每列中获取 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...但我还没有成功。找不到任何依据,网上冲浪..
提前致谢
试试这个:
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
尝试使用应用:
a<-apply(table,2,function(x){mean(head(sort(x),5))})
你最简单的猜测是在这里应用,因为你想按列应用。使用一些示例数据:
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 想象为 dataframe/matrix 的一列),然后使用
mean
sort
的前 5 个元素(索引[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
您正在寻找colMeans
,使代码更紧凑:
colMeans(head(apply(m, 2, sort),5))