【问题标题】:Whats wrong with this for loop to calculate the mean of each row?这个for循环计算每一行的平均值有什么问题?
【发布时间】:2019-10-08 20:53:16
【问题描述】:

我试试

-为我的数据框“alpha”计算从第 2 列到第 11 列每一行的平均值

-将结果添加到我的数据框“alpha”的第 12 列中,该列当前具有“NA”值

  • 第 1 列是“locs”

  • 我的 df:

         [,1][,2][,3][,4][,5][,6][,7][,8][,9][,10][,11][,12]...[,17] 
     [1,]  A1   5   9   4   8   12  4   8  12   4    8    NA     NA
     [2,]  C3   6   10  4   8   12  4   8  12   4    8    NA     NA
     [3,]  P2   7   11  5   6   10  5   6  10   5    6    NA     NA
     [4,]  4    8   12  5   6   10  5   6  10   5    6    NA     NA
     [49,] 4    8   12  5   6   10  5   6  10   5    6    NA     NA
    

我对 R 不是很熟悉,也不明白问题所在。

这是我尝试过的两个不同的 for 循环和警告消息:

> for (j in 1:49){
+   alpha[j, 12] <- mean(alpha[j,2:11])
+ }
There were 49 warnings (use warnings() to see them)
> 
> for (j in 1:length(locs)) {
+   alpha$mean[j] <- mean(alpha[j,2:11])
+ }
There were 49 warnings (use warnings() to see them)
> 
> warnings()
Warnmeldungen:
1: In mean.default(alpha[j, 2:11]) :
  Argument ist weder numerisch noch boolesch: gebe NA zurück
2: In mean.default(alpha[j, 2:11]) :
  Argument ist weder numerisch noch boolesch: gebe NA zurück

    data.frame':    49 obs. of  17 variables:
 $ locs: Factor w/ 49 levels "A1","C3",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ sum.2009    : num  12 11 12 15 22 18 14 18 8 9 ...
 $ sum.2010    : num  14 11 13 18 22 21 15 21 16 17 ...
 $ sum.2011    : num  15 12 20 18 26 25 22 18 25 14 ...
 $ sum.2012    : num  15 13 17 25 24 20 24 28 26 20 ...
 $ sum.2013    : num  14 9 21 21 28 20 14 19 23 21 ...
 $ sum.2014    : num  21 16 28 24 32 26 19 22 7 12 ...
 $ sum.2015    : num  27 27 31 23 17 6 14 26 19 19 ...
 $ sum.2016    : num  18 18 14 23 25 22 24 39 32 15 ...
 $ sum.2017    : num  18 18 23 35 22 7 12 27 15 16 ...
 $ sum.2018    : num  25 23 25 26 20 11 12 13 7 8 ...
 $ mean        : num  NA NA NA NA NA NA NA NA NA NA ...

然后我使用以下方法将“locs”从因子转换为数字:

alpha$locs &lt;- as.numeric(alpha$locs)

alpha$locs &lt;- lapply(alpha$locs , as.numeric)

两者都有效,但运行后我仍然收到相同的错误消息 for 循环。

【问题讨论】:

  • 不要使用for loop,而是考虑使用rowMeans,例如rowMeans(alpha[, 2:11])。它要快得多。警告还告诉您某些列不是数字的。

标签: r dataframe for-loop


【解决方案1】:

alpha[1, 2:11] 是一个只有一行的数据框,而不是一个向量,mean 不知道如何处理数据框。更好的方法是alpha[, 12] = rowMeans(alpha[, 2:11])

如果alpha 是矩阵,您的方法就可以正常工作 - 矩阵只能具有一种数据类型,因此行或列始终可以转换为向量。但是数据框都是关于列的,列可以有不同的类型。 alpha[2:11, 1] 是一个向量,因为它全部来自一列,每一列都是一个向量,所以它只是向量的一部分。但是alpha[1, 2:11] 跨越了几列,每一列可能有不同的类型,所以 R 将其保留为数据框。

您可以采取的另一种方法是 unlist 每行将其转换为向量 alpha[j, 12] &lt;- mean(unlist(alpha[j,2:11]))。这会起作用,但与rowMeans 方法相比会非常慢。

【讨论】:

    猜你喜欢
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2014-11-27
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多