如何根据条件(根据另一列)获取R中多列的中位数]]

问题描述 投票:1回答:2

我是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))

因此,对于每一列,我想用特定大洲。]中的值的中位数替换缺少的值。

我是R的初学者,我想知道如何执行以下任务:我想用数据集中所有列的中位数替换数据集中的缺失值。但是,对于每一列,...

这里是使用库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()

我们可以使用dplyr::mutate_at将其每一列中的NAContinent除外)替换为其Continent组的中位数

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不是数字)的所有列except

:如果is.na为TRUE,则将其替换为中位数,并且由于已分组,因此将是Continent组的中位数。最后,我们称呼ungroup为佳,以恢复“正常” tibble
r conditional-statements median multiple
2个回答
0
投票

这里是使用库dplyr的解决方案。我调用了您的数据框ww,并将其重命名为列:


0
投票

我们可以使用dplyr::mutate_at将其每一列中的NAContinent除外)替换为其Continent组的中位数

library(dplyr)
df %>%
  group_by(Continent) %>% 
  mutate_at(vars(-group_cols(), -Country), ~ifelse(is.na(.), median(., na.rm = TRUE), .)) %>% 
  ungroup()
© www.soinside.com 2019 - 2024. All rights reserved.