Как получить медиану нескольких столбцов в R с условиями (согласно другому столбцу) - PullRequest
2 голосов
/ 06 марта 2020

Я новичок в R и хотел бы знать, как выполнить следующую задачу:

Я хочу заменить отсутствующие значения моего набора данных медианой для всех столбцов моего набора данных. Однако для каждого столбца я хочу получить медиану определенной категории (в зависимости от другого столбца). Мой набор данных выглядит следующим образом

structure(list(Country = structure(1:5, .Label = c("Afghanistan", 
"Albania", "Algeria", "Andorra", "Angola"), class = "factor"), 
    CountryID = 1:5, Continent = c(1L, 2L, 3L, 2L, 3L), Adolescent.fertility.rate.... = c(151L, 
    27L, 6L, NA, 146L), Adult.literacy.rate.... = c(28, 98.7, 
    69.9, NA, 67.4)), class = "data.frame", row.names = c(NA, 
-5L))

Поэтому для каждого из столбцов я хочу заменить отсутствующие значения на медиана значений на специфике c континента.

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Мы можем использовать dplyr::mutate_at для замены NA s в каждом столбце (кроме Continent и нечислового c столбца Country) медианой для Continent группы

df <- structure(list(Country = structure(1:5, .Label = c("Afghanistan",  "Albania", "Algeria", "Andorra", "Angola"), class = "factor"), 
               CountryID = 1:5, Continent = c(1L, 2L, 3L, 2L, 3L),
               Adolescent.fertility.rate.... = c(151L, 27L, 6L, NA, 146L),
               Adult.literacy.rate.... = c(28, 98.7, 69.9, NA, 67.4)), class = "data.frame", row.names = c(NA, -5L))

library(dplyr)
df %>%
  group_by(Continent) %>% 
  mutate_at(vars(-group_cols(), -Country), ~ifelse(is.na(.), median(., na.rm = TRUE), .)) %>% 
  ungroup()

Возвращает:

  # A tibble: 5 x 5
    Country     CountryID Continent Adolescent.fertility.rate.... Adult.literacy.rate....
    <fct>           <int>     <int>                         <int>                   <dbl>
  1 Afghanistan         1         1                           151                    28  
  2 Albania             2         2                            27                    98.7
  3 Algeria             3         3                             6                    69.9
  4 Andorra             4         2                            27                    98.7
  5 Angola              5         3                           146                    67.4

Объяснение: Сначала мы сгруппируем data.frame df по Continent. Затем мы изменяем все столбцы , за исключением столбец группировки (и Country, который не является цифрой c), следующим образом: если is.na равен TRUE, мы заменяем его на медиану, и так как мы сгруппированный, это будет медиана для группы Continent (если это не NA, мы заменим ее на себя). Наконец, мы призываем ungroup, чтобы вернуть «нормальный» tibble .

1 голос
/ 06 марта 2020

Вот решение с использованием библиотеки dplyr. Я назвал ваш фрейм данных ww и переименовал ваш столбец:

library('dplyr')
ww %>% 
  rename(
    lit_rate = Adult.literacy.rate....
  ) %>% 
  group_by(
    Continent
  ) %>% 
  mutate(
    lit_rate = replace(
      lit_rate,
      is.na(lit_rate),
      median(lit_rate, na.rm = TRUE)
    )
  ) %>% 
  ungroup()
...