首页 > 解决方案 > Ifelse 在 R 中使用 dplyr

问题描述

我想使用 dplyr 将每个 ID 的 DV 列中的 NA 值替换为该人特定时间点的 DV 值:

我不知道如何使用 dplyr 来做到这一点。这是我的数据集:

ID   TIME  DV
1      0   5
1      2   NA
1      4   4 
2      0   3
2      2   3
2      4   NA
3      0   7
3      2   NA
3      4   9

预期输出:

ID   TIME  DV
1      0   5
1      2   4
1      4   4 
2      0   3
2      2   3
2      4   3
3      0   7
3      2   9
3      4   9

任何建议表示赞赏。最好的,

标签: rdplyr

解决方案


我同意@akrun 的观点,一般来说这可能fill很合适,但你的规则建议处理事情有点不同(因为"updown"不遵守你的规则)。

library(dplyr)
# library(tidyr)
dat %>%
  tidyr::pivot_wider(id_cols = "ID", names_from = "TIME", values_from = "DV") %>%
  mutate(
    `2` = if_else(is.na(`2`), `4`, `2`),
    `4` = if_else(is.na(`4`), `0`, `4`)
  ) %>%
  tidyr::pivot_longer(-ID, names_to = "TIME", values_to = "DV")
# # A tibble: 9 x 3
#      ID TIME     DV
#   <int> <chr> <int>
# 1     1 0         5
# 2     1 2         4
# 3     1 4         4
# 4     2 0         3
# 5     2 2         3
# 6     2 4         3
# 7     3 0         7
# 8     3 2         9
# 9     3 4         9

通过查看中间管道可能有助于可视化这是在做什么:

dat %>%
  tidyr::pivot_wider(id_cols = "ID", names_from = "TIME", values_from = "DV")
# # A tibble: 3 x 4
#      ID   `0`   `2`   `4`
#   <int> <int> <int> <int>
# 1     1     5    NA     4
# 2     2     3     3    NA
# 3     3     7    NA     9
dat %>%
  tidyr::pivot_wider(id_cols = "ID", names_from = "TIME", values_from = "DV") %>%
  mutate(
    `2` = if_else(is.na(`2`), `4`, `2`),
    `4` = if_else(is.na(`4`), `0`, `4`)
  )
# # A tibble: 3 x 4
#      ID   `0`   `2`   `4`
#   <int> <int> <int> <int>
# 1     1     5     4     4
# 2     2     3     3     3
# 3     3     7     9     9

推荐阅读