Как исправить в R: аргумент не является числовым или логическим: возвращается na


Одно предупреждение, с которым вы можете столкнуться в R:

Warning message:
In mean.default(df) : argument is not numeric or logical: returning NA

Это предупреждение появляется, когда вы пытаетесь вычислить среднее значение какого-либо объекта в R, который не является числовым или логическим.

В этом руководстве рассказывается, как именно обрабатывать это предупреждение на практике.

Как воспроизвести предупреждение

Предположим, мы создаем следующий фрейм данных в R:

#create data frame
df <- data.frame(team=c('A', 'B', 'C', 'D', 'E'),
 points=c(99, 90, 86, 88, 95),
 assists=c(33, 28, 31, 39, 34),
 rebounds=c(30, 28, 24, 24, 28))

#view data frame
df

 team points assists rebounds
1 A 99 33 30
2 B 90 28 28
3 C 86 31 24
4 D 88 39 24
5 E 95 34 28

Если мы попытаемся вычислить среднее значение столбца символов или попытаемся вычислить среднее значение всего фрейма данных, мы получим предупреждение:

#attempt to calculate mean of character column
mean(df$team)

Warning message:
In mean.default(df$team) : argument is not numeric or logical: returning NA

#attempt to calculate mean of entire data frame
mean(df)

Warning message:
In mean.default(df) : argument is not numeric or logical: returning NA

Функция mean() принимает в качестве аргумента только числовой вектор, что объясняет, почему мы получаем предупреждение в обоих сценариях.

Как справиться с предупреждением

Чтобы справиться с этим предупреждением, используйте функцию mean() только с числовыми векторами.

Например, мы могли бы вычислить среднее значение столбца точек, поскольку оно числовое:

#calculate mean of points column
mean(df$points)

[1] 91.6

Или мы могли бы использовать функцию sapply() для вычисления среднего значения каждого столбца во фрейме данных:

#calculate mean of every column in data frame
sapply(df, mean, 2)

 team points assists rebounds 
 NA 90 33 28 

Warning message:
In mean.default(X[[i]], ...) :
 argument is not numeric or logical: returning NA

Мы можем вычислить среднее значение каждого числового столбца, но по-прежнему получаем предупреждающее сообщение, так как мы попытались вычислить среднее значение столбца символов «команда».

Чтобы полностью избежать этого предупреждения, мы могли бы использовать функцию sapply() только с тремя числовыми столбцами:

#calculate mean of each numeric column
sapply(df[c('points', 'assists', 'rebounds')], mean, 2)
 points assists rebounds 
 90 33 28

Обратите внимание, что среднее значение каждого числового столбца успешно показано, и мы не получаем предупреждающего сообщения.

Дополнительные ресурсы

В следующих руководствах объясняется, как исправить другие распространенные ошибки в R:

Как исправить: условие имеет длину > 1 и будет использоваться только первый элемент
Как исправить: нечисловой аргумент бинарного оператора
Как исправить: dim(X) должен иметь положительную длину
Как исправить: ошибка при выборе неиспользуемых аргументов