Вычислить среднее значение столбца в R, имеющего не числовые значения - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть столбец, который содержит числовые и нечисловые значения.Я хочу найти среднее числовых значений, которые я могу использовать для замены нечисловых значений.Как это можно сделать в R?

Ответы [ 4 ]

9 голосов
/ 12 сентября 2011

Скажите, что ваш фрейм данных называется df, а столбец, который вы хотите "исправить", называется df$x.Вы можете сделать следующее.

Вы должны выполнить разбор, а затем преобразовать в числовое значение.Это даст вам NA для всех строк символов, которые нельзя объединить в числа.

nums <- as.numeric(as.character(df$x))

Как отметил Ричи Коттон, существует «более эффективный, но трудный для запоминания» способ преобразования факторов в числовые

nums <- as.numeric(levels(df$x))[as.integer(df$x)]

Чтобы получить среднее значение, вы используете mean(), но передаете na.rm = T

m <- mean(nums, na.rm = T)

Назначьте среднее для всех значений NA.

nums[is.na(nums)] <- m

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

df$new.x <- nums
2 голосов
/ 12 сентября 2011

Это функция, которую я написал вчера для борьбы с нечисловыми типами. У меня есть data.frame с непредсказуемым типом для каждого столбца. Я хочу рассчитать средние значения для чисел и оставить все остальное нетронутым.

colMeans2 <- function(x) {
    # This function tries to guess column type. Since all columns come as
    # characters, it first tries to see if x == "TRUE" or "FALSE". If
    # not so, it tries to coerce vector into integer. If that doesn't 
    # work it tries to see if there's a ' \" ' in the vector (meaning a
    # column with character), it uses that as a result. Finally if nothing
    # else passes, it means the column type is numeric, and it calculates
    # the mean of that. The end.

#   browser()

    # try if logical
    if (any(levels(x) == "TRUE" | levels(x) == "FALSE")) return(NA)

    # try if integer
    try.int <- strtoi(x)
    if (all(!is.na(try.int)))  return(try.int[1])

    # try if character
    if (any(grepl("\\\"", x))) return(x[1])

    # what's left is numeric
    mean(as.numeric(as.character(x)), na.rm = TRUE)
    # a possible warning about coerced NAs probably originates in the above line
}

Вы бы использовали это так:

apply(X = your.dataframe, MARGIN = 2, FUN = colMeans2)
0 голосов
/ 12 сентября 2011

Компактное преобразование:

  vec <- c(0:10,"a","z")
  vec2 <- (as.numeric(vec))
  vec2[is.na(vec2)] <- mean(vec2[!is.na(vec2)])

as.numeric напечатает предупреждающее сообщение, указанное ниже, и преобразует нечисловое значение в NA.

Warning message:
In mean(as.numeric(vec)) : NAs introduced by coercion
0 голосов
/ 12 сентября 2011

Это зависит от того, как выглядят ваши данные.

Как это выглядит?

data = list(1, 2, 'new jersey')

Тогда вы можете

data.numbers = sapply(data, as.numeric)

и получить

c(1, 2, NA)

И вы можете найти среднее значение с помощью

mean(data.numbers, na.rm=T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...