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

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

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

res <- list()
for(i in 1:nrow(df))
  z <- df[i,]
  z <- unlist(z) 
  z <- mean(z)
  res[[i]] <- z
  print(res)

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

res <- list()
col.mean <- function(x){
  for(i in 1:nrow(x))
    z <- x[i,]
    z <- unlist(z) 
    z <- mean(z)
    res[[i]] <- z
    return(res)
}

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

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

sdnqo3pr1#

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

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

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

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

rowMeans2 <- \(df, ...) {
  res <- vector("list", nrow(df))
  for(i in seq(nrow(df))) {
    res[[i]] <- mean(unlist(df[i, ]), ...)
  }
  res
}

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

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

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

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

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

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

data <- iris[, sapply(iris, is.numeric)]
lf5gs5x2

lf5gs5x22#

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

res <- list()

col.mean <- function(x){
for(i in 1:nrow(x)){
  z <- x[i,]
z <- unlist(z) 
z <- mean(z)
res[[i]] <- z
return(res)
}
}

col.mean(iris)

print(res)

字符串

相关问题