r - 用序列中的缺失值替换 NA (R)
问题描述
我有一个像
现在我想用 15 替换 Col B = NA ,因为这是缺失值。Col C 第一个 NA 为 14,第二个 NA 为 15。 Col D 第一个 NA 为 13,第二个 NA 为 14,第三个 NA 为 15。所以数字遵循从上到下或从下到上的顺序。
可重现的样本数据
structure(list(`Col A` = c(11, 12, 13, 14, 15), `Col B` = c(NA,
11, 12, 13, 14), `Col C` = c(NA, NA, 11, 12, 13), `Col D` = c(NA,
NA, NA, 11, 12)), row.names = c(NA, -5L), class = c("tbl_df",
"tbl", "data.frame"))
解决方案
我认为您可以在以下解决方案中使用tidyverse
:
library(dplyr)
library(purrr)
df[1] %>%
bind_cols(map_dfc(2:length(df), function(x) {
df[[x]][which(is.na(df[[x]]))] <- setdiff(df[[1]], df[[x]][!is.na(df[[x]])])
df[x]
}))
# A tibble: 5 x 4
`Col A` `Col B` `Col C` `Col D`
<dbl> <dbl> <dbl> <dbl>
1 11 15 14 13
2 12 11 15 14
3 13 12 11 15
4 14 13 12 11
5 15 14 13 12
或者在基础 R中,我们可以这样做:
do.call(cbind, Reduce(function(x, y) {
i <- which(is.na(df[[y]]))
df[[y]][i] <- sort(setdiff(x, df[[y]]))
df[[y]]
}, init = df[[1]], 2:length(df), accumulate = TRUE)) |>
as.data.frame() |>
setNames(paste0("Col", LETTERS[1:length(df)]))
ColA ColB ColC ColD
1 11 15 14 13
2 12 11 15 14
3 13 12 11 15
4 14 13 12 11
5 15 14 13 12
推荐阅读
- javascript - 如何使用javascript只打开一次新标签
- awk - 删除文本文件中的非常规字段分隔符 (^@^@^@)
- github-pages - 我想从 github 克隆到我的桌面。但我仍然遇到一些问题
- reactjs - 反应原生视频组件没有显示?
- javascript - 如何在范围滑块上分配标签
- path - Revit Ironpython Shell - 解析路径中反斜杠后带有数字的文件名列表
- excel - 目录的罗马数字页码
- c# - WPF ListView - 在未单击所选项目时检测 ListVewItem
- kdb - KDB+/Q:填充不规则列表的有效方法(矩阵)
- html - 如何在导航栏后面制作横幅文本