Что не так с этим циклом for для вычисления среднего значения каждой строки? - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь

- вычислить среднее значение каждой строки из столбца 2–11 для моего кадра данных «альфа»

- добавить результат в столбец 12 моего кадра данных «альфа», которыйв настоящее время имеет значения "NA"

  • столбец 1 является "locs"

  • my 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 <- as.numeric(alpha$locs)

alpha$locs <- lapply(alpha$locs , as.numeric)

, которые оба работали, но я все еще получал те же сообщения об ошибках после запуска forпетли.

1 Ответ

0 голосов
/ 09 октября 2019

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] <- mean(unlist(alpha[j,2:11])). Это будет работать, но это будет очень медленно по сравнению с подходом rowMeans.

...