一些 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)))
假设您有一个像 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)))