替换未知类别中的中位数时,在 R 中获取 NA
When replacing medians in an unknown category get NA in R
我有两个数据集
d1=structure(list(et = c("s", "s"), gg = c("d", "d"), hj = c("f",
"f"), ggh = c("h", "h"), wer = c(23L, 45L)), class = "data.frame", row.names = c(NA,
-2L))
和
d2=structure(list(et = c("s", "s"), gg = c("d", "d"), hj = c("f",
"f"), ggh = c("h", "f"), wer = c(3L, 7L)), class = "data.frame", row.names = c(NA,
-2L))
我根据以下原则执行更改值:如果在数据集 d2
中,与 d1
相同类别的值 wer
小于或大于 [=18] 的中位数=] 对于 1 上的这个类别,然后在 d2 中输入这个类别中的中值。
为了更清楚我想要什么,对于来自 d1
的这个类别
et gg hj ggh (this categorical vars)
s d f h
wer=34
的中位数
d2 具有相同的类别 s d f h
,其中 wer=3,所以 3<34 所以我必须在 34 上更改此值,
但 d2 也有 d1 中不存在的类别 s d f f
,因此我们在 d1 中留下未知类别的值。
现在我使用代码
library(dplyr)
d1 %>%
group_by(across(-wer)) %>%
summarise(wer = median(wer), .groups = "drop") %>%
right_join(d2, by = c("et", "gg", "hj", "ggh"), suffix = c("", ".y")) %>%
mutate(wer = ifelse(wer >= wer.y, wer, wer.y), .keep = "unused")
它满足了我的需要,但是,对于 d1 中的未知类别,它降低了 NA
结果
et gg hj ggh wer
<chr> <chr> <chr> <chr> <dbl>
1 s d f h 34
2 s d f f NA
但必须是来自 d2 的此类别的真实值,例如这样
et gg hj ggh wer
<chr> <chr> <chr> <chr> <dbl>
1 s d f h 34
2 s d f f 7
我该如何解决?
感谢您的帮助
比较运算符 returns NA
当有 NA
> 7 > NA
[1] NA
在代码中,我们只需要通过使用is.na
添加条件来对NA
进行更正
library(dplyr)
d1 %>%
group_by(across(-wer)) %>%
summarise(wer = median(wer), .groups = "drop") %>%
right_join(d2, by = c("et", "gg", "hj", "ggh"), suffix = c("", ".y")) %>%
mutate(wer = ifelse(wer >= wer.y & !is.na(wer), wer, wer.y), .keep = "unused")
# A tibble: 2 × 5
et gg hj ggh wer
<chr> <chr> <chr> <chr> <dbl>
1 s d f h 34
2 s d f f 7
我有两个数据集
d1=structure(list(et = c("s", "s"), gg = c("d", "d"), hj = c("f",
"f"), ggh = c("h", "h"), wer = c(23L, 45L)), class = "data.frame", row.names = c(NA,
-2L))
和
d2=structure(list(et = c("s", "s"), gg = c("d", "d"), hj = c("f",
"f"), ggh = c("h", "f"), wer = c(3L, 7L)), class = "data.frame", row.names = c(NA,
-2L))
我根据以下原则执行更改值:如果在数据集 d2
中,与 d1
相同类别的值 wer
小于或大于 [=18] 的中位数=] 对于 1 上的这个类别,然后在 d2 中输入这个类别中的中值。
为了更清楚我想要什么,对于来自 d1
et gg hj ggh (this categorical vars)
s d f h
wer=34
的中位数d2 具有相同的类别 s d f h
,其中 wer=3,所以 3<34 所以我必须在 34 上更改此值,
但 d2 也有 d1 中不存在的类别 s d f f
,因此我们在 d1 中留下未知类别的值。
现在我使用代码
library(dplyr)
d1 %>%
group_by(across(-wer)) %>%
summarise(wer = median(wer), .groups = "drop") %>%
right_join(d2, by = c("et", "gg", "hj", "ggh"), suffix = c("", ".y")) %>%
mutate(wer = ifelse(wer >= wer.y, wer, wer.y), .keep = "unused")
它满足了我的需要,但是,对于 d1 中的未知类别,它降低了 NA 结果
et gg hj ggh wer
<chr> <chr> <chr> <chr> <dbl>
1 s d f h 34
2 s d f f NA
但必须是来自 d2 的此类别的真实值,例如这样
et gg hj ggh wer
<chr> <chr> <chr> <chr> <dbl>
1 s d f h 34
2 s d f f 7
我该如何解决? 感谢您的帮助
比较运算符 returns NA
当有 NA
> 7 > NA
[1] NA
在代码中,我们只需要通过使用is.na
NA
进行更正
library(dplyr)
d1 %>%
group_by(across(-wer)) %>%
summarise(wer = median(wer), .groups = "drop") %>%
right_join(d2, by = c("et", "gg", "hj", "ggh"), suffix = c("", ".y")) %>%
mutate(wer = ifelse(wer >= wer.y & !is.na(wer), wer, wer.y), .keep = "unused")
# A tibble: 2 × 5
et gg hj ggh wer
<chr> <chr> <chr> <chr> <dbl>
1 s d f h 34
2 s d f f 7