Почему я получаю это сообщение при использовании функции замены?В mean.default (x, na.rm = TRUE): аргумент не является числовым или логическим: возвращает NA - PullRequest
0 голосов
/ 31 декабря 2018

Я немного поиграл с функциями замены в R и сделал эту простую функцию, которая изменяет значение для среднего вектора.Он отлично работает на одном векторе:

'value.for.mean<-' <- function(x, value, ...) {
    x[value] = mean(x, na.rm=TRUE)
    x
}

x <- c(1:3,NA, 2:5,1:10, NA, NA)
value.for.mean(x) <- is.na(x)
x   

#Output:    
[1]  1.00  2.00  3.00  4.41  2.00  3.00  4.00  5.00  1.00  2.00  3.00  4.00
[13]  5.00  6.00  7.00  8.00  9.00 10.00  4.41  4.41

Когда я пытаюсь использовать ту же функцию с data.frame, я получаю сообщение об ошибке:

x <- data.frame(a=c(1,3,NA,4,2), b=c(9,8,5,4,NA))
value.for.mean(x) <- is.na(x)
Warning message:
In mean.default(x, na.rm = TRUE) :
  argument is not numeric or logical: returning NA

Я прочитал много потоков в SO, которые ссылаются на эту ошибку, но никто не указывает на этот конкретный случай, поскольку мои переменные являются числовыми, как вы можете видеть при вызове str(x)

'data.frame':   5 obs. of  2 variables:
 $ a: num  1 3 NA 4 2
 $ b: num  9 8 5 4 NA

Заранее спасибо за вашеКомментарии.

1 Ответ

0 голосов
/ 31 декабря 2018

mean работает на vector.Согласно ?mean, используется значение

mean(x, ...)

, где

x - объект R.В настоящее время существуют методы для числовых / логических векторов и объектов даты, даты и времени.

Итак, когда мы применяем mean ко всему data.frame, выдается одно и то же предупреждение.как в посте ОП, потому что функция ОП является оберткой вокруг mean

mean(x)
#[1] NA

Предупреждающее сообщение: в mean.default (x): аргумент не является числовым или логическим: возвращает NA


Нам нужно перебрать столбцы и применить функцию, вернуть столбец и обновить list из vector s до исходного набора данных

x[] <- lapply(x, function(y) {
              value.for.mean(y) <- is.na(y)
               y})

Или применить его с помощью tidyverse

library(tidyverse)
x %>% 
    mutate_all(funs({value.for.mean(.) <- is.na(.); .}))

Здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...