R中的For循环自动计算 Dataframe 的平均值

dtcbnfnu  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(169)

下面的代码用于计算列的平均值的嵌套工作:

  1. res <- list()
  2. for(i in 1:nrow(df))
  3. z <- df[i,]
  4. z <- unlist(z)
  5. z <- mean(z)
  6. res[[i]] <- z
  7. print(res)

字符串
但是,如果我尝试将代码转换为函数,输出列表中的每一列都是“NULL”,除了最后一列:

  1. res <- list()
  2. col.mean <- function(x){
  3. for(i in 1:nrow(x))
  4. z <- x[i,]
  5. z <- unlist(z)
  6. z <- mean(z)
  7. res[[i]] <- z
  8. return(res)
  9. }

下面的函数似乎是工作,但我不明白它背后的逻辑。对我来说,这两个函数是相似的,除了后一个更简单。

  1. res <- list()
  2. col.mean <- function(x){
  3. for(i in 1:nrow(x))
  4. res[[i]] <- mean(unlist(x[i,]))
  5. return(res)
  6. }
sdnqo3pr

sdnqo3pr1#

我假设你想计算行的平均值。

1.base R中有一个函数,速度很快:rowMeans(),详见help(rowMeans)
**2.**For-loops并不是一种非常像R的方式。对你的循环做一些修改:

  1. # do not grow objects inside loops!
  2. res <- vector("list", nrow(data))
  3. # I prefer seq(nrow(data) over 1:nrow(data)
  4. for(i in seq(nrow(data))) {
  5. res[[i]] <- mean(unlist(data[i, ]))
  6. }

字符串
封装成一个自编写的函数:

  1. rowMeans2 <- \(df, ...) {
  2. res <- vector("list", nrow(df))
  3. for(i in seq(nrow(df))) {
  4. res[[i]] <- mean(unlist(df[i, ]), ...)
  5. }
  6. res
  7. }

...-parameter/argument”允许您在mean()中指定参数,例如na.rm = TRUE

**3.**在R中,我们经常使用*apply()-函数(循环的 Package 器)而不是自写循环。这里我使用lapply(),因为你似乎希望你的结果以列表格式存储。

  1. rowMeans3 <- \(df, ...) {
  2. lapply(X = seq(nrow(df)), FUN = \(i) mean(unlist(df[i, ]), ...))
  3. }

4.@Jilber Urbina在下面的评论中建议避免unlist()的替代方案:

  1. rowMeans4 <- \(df, ...) {
  2. sapply(X = seq(nrow(df)), FUN = \(i) mean(as.numeric(df[i, ]), ...))
  3. }

在一个名为“iris”的内置数据集上进行测试。我删除了非数字列。数据:

  1. data <- iris[, sapply(iris, is.numeric)]
展开查看全部
lf5gs5x2

lf5gs5x22#

我相信这对我来说是可行的,只有很少的变化,如下所示

  1. res <- list()
  2. col.mean <- function(x){
  3. for(i in 1:nrow(x)){
  4. z <- x[i,]
  5. z <- unlist(z)
  6. z <- mean(z)
  7. res[[i]] <- z
  8. return(res)
  9. }
  10. }
  11. col.mean(iris)
  12. print(res)

字符串

展开查看全部

相关问题