我有一个按‘id’分组的数据框和一个包含缺失值NA的变量‘age’.

在每个‘id’中,我想替换缺少的‘age’值,但只"填充"beforefirst个非NA值.

data <- data.frame(id=c(1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3),
                   age=c(NA,6,NA,8,NA,NA,NA,NA,3,8,NA,NA,NA,7,NA,9))

   id age
1   1  NA
2   1   6 # first non-NA in id = 1. Fill up from here
3   1  NA
4   1   8
5   1  NA
6   1  NA
7   2  NA
8   2  NA
9   2   3 # first non-NA in id = 2. Fill up from here
10  2   8
11  2  NA
12  3  NA
13  3  NA
14  3   7 # first non-NA in id = 3. Fill up from here
15  3  NA
16  3   9

预期输出:

1   1   6
2   1   6
3   1  NA
4   1   8
5   1  NA
6   1  NA
7   2   3
8   2   3
9   2   3
10  2   8
11  2  NA
12  3   7
13  3   7
14  3   7
15  3  NA
16  3   9

我试着使用fill.direction = "up",如下所示:

library(dplyr)
library(tidyr)

data1 <- data %>% group_by(id) %>%  
  fill(!is.na(age[1]), .direction = "up")

推荐答案

您可以使用cumall(is.na(age))来查找第一个非NA值之前的位置.

library(dplyr)

data %>%
  group_by(id) %>%
  mutate(age2 = replace(age, cumall(is.na(age)), age[!is.na(age)][1])) %>%
  ungroup()

# A tibble: 16 × 3
      id   age  age2
   <dbl> <dbl> <dbl>
 1     1    NA     6
 2     1     6     6
 3     1    NA    NA
 4     1     8     8
 5     1    NA    NA
 6     1    NA    NA
 7     2    NA     3
 8     2    NA     3
 9     2     3     3
10     2     8     8
11     2    NA    NA
12     3    NA     7
13     3    NA     7
14     3     7     7
15     3    NA    NA
16     3     9     9

R相关问答推荐

如果R上的不同时期之间的值发生了变化,则创建假人

如何替换某个字符的所有出现,但如果该字符是字符串中的第一个,则不替换?

如何删除多个.CSV文件的行

如何使用`ggplot2::geom_segment()`或`ggspatial::geom_spatial_segment()`来处理不在格林威治中心的sf对象?

根据选中三个复选框中的一个或两个来调整绘图

手动打印线型gplot

为什么在ggplot2中添加geom_text这么慢?

将数据集中的值增加到当前包含的最大值

如何在一次运行中使用count进行多列计数

如果可能,将数字列转换为整数,否则保留为数字

在数组索引上复制矩阵时出错

当我添加美学时,geom_point未对齐

R如何计算现有行的总和以添加新的数据行

随机森林的带Shap值的蜂群图

如何使这些react 表对象相互独立?

R如何将列名转换为更好的年和月格式

如何删除R中除数字元素以外的所有元素

在散点图中使用geom_point放置线图例

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

抽样变换-REXP与RWEIBUR