r - Ifelse 在 R 中使用 dplyr
问题描述
我想使用 dplyr 将每个 ID 的 DV 列中的 NA 值替换为该人特定时间点的 DV 值:
- 我想将每个 ID 的时间 2 的 NA(DV 列)替换为该特定 ID 的时间 4 的 DV 值。
- 我想将每个 ID 的时间 4 的 NA(DV 列)替换为该特定 ID 的时间 0 的 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
任何建议表示赞赏。最好的,
解决方案
我同意@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
推荐阅读
- java - 如何在没有自动装配的情况下实例化spring数据jpa存储库
- python - 如何找到一行数据中两列值之间的最大差异
- html - 元素上的边距将整个页面向下移动
- javascript - 如何在打开搜索结果后保留搜索输入的历史记录,然后通过浏览器按钮返回 Angular2 中的谷歌搜索?
- reactjs - 输入文本验证本机反应
- java - 无法使用 Idea 启动 Cucumber 测试
- sql - 空查询的 SQL 返回结果
- c++ - 没有从“int”到“时间”的可行转换
- sql - 0 * - 1 = -0 将 float 转换为 varchar 时出现奇怪的结果
- java - 使用 spring 的 AbstractXlsxView 下载大文件