一些 Na 值而不是全部

Some Na values and not all

假设您有一个像 starwars 这样的数据集。还假设您有 2 列,一列包含 20 个 NA 值,另一列包含物种(人类、机器人、机器等)。

如何使用管道将属于人类类别的na值转换为身高的平均值?

如果我们将它转​​换为总数,那将是错误的,因为机器可能会更小或更高,因此我们会得到一些关于人类身高的奇怪值。

P.s。我知道如何使用替换或 ifelse 来做到这一点,但如何添加分类

在星战场景中,您可以进行以下操作

library(dplyr)

starwars %>% 
  group_by(species) %>% 
  mutate(height = if_else(species == "Human" & is.na(height), mean(height, na.rm = TRUE), as.double(height))) %>% 
  ungroup()

从这里可以看出,height只填充了人类作为物种的平均值

library(dplyr)

starwars %>% 
  group_by(species) %>% 
  mutate(newheight = if_else(species == "Human" & is.na(height), mean(height, na.rm = TRUE), as.double(height))) %>% 
  ungroup() %>% 
  select(species, height, newheight) %>% 
  filter(is.na(height))

#> # A tibble: 6 x 3
#>   species height newheight
#>   <chr>    <int>     <dbl>
#> 1 Human       NA      177.
#> 2 Human       NA      177.
#> 3 Human       NA      177.
#> 4 Human       NA      177.
#> 5 Droid       NA       NA 
#> 6 NA          NA       NA 

在这个具体示例中,您需要将 height 转换为 double,因为它是 integer,并且,由于 if_else 是类型一致的并且来自mean你收到一个double,你需要相应地转换height

如果我没理解错的话,你只是想用分组方式替换 NA?

应该这样做:

data(starwars)

head(starwars)

#This shows one missing value (NAs) for "Droid"
starwars %>%
  group_by(species) %>%
  summarize(M = mean(height, na.rm=T),
            NAs = sum(is.na(height)))

#Replace NAs by group-wise means
starwars <- starwars %>%
  group_by(species) %>%
  mutate(height = if_else(is.na(height), mean(height, na.rm=T), as.double(height) )) %>%
  ungroup()

#Now no missing value any more and means (M) remains the same
starwars %>%
  group_by(species) %>%
  summarize(M = mean(height, na.rm=T),
            NAs = sum(is.na(height)))