替换变量的所有NA值,其中一行等于0

Rob*_*man 17 r complete na

这句话有点难,据我所知,没有一个类似的问题回答了我的问题.

我有一个data.frame,如:

df1 <- data.frame(id = rep(c("a", "b","c"), each = 4),
                  val = c(NA, NA, NA, NA, 1, 2, 2, 3,NA,2,NA,3))

df1

   id val
1   a  NA
2   a  NA
3   a  NA
4   a  NA
5   b   1
6   b   2
7   b   2
8   b   3
9   c  NA
10  c   2
11  c  NA
12  c   3
Run Code Online (Sandbox Code Playgroud)

我想摆脱所有NA值(使用例如filter()很容易),但要确保如果这删除了所有的一个id值(在这种情况下它删除了"a"的每个实例),那么一个额外的行是插入(例如)a = 0

以便:

  id val
1  a   0
2  b   1
3  b   2
4  b   2
5  b   3
6  c   2
7  c   3
Run Code Online (Sandbox Code Playgroud)

显然很容易以迂回的方式做到这一点,但我想知道是否有一个整洁/优雅的方式来做到这一点.我认为tidyr :: complete()可能有所帮助,但不完全确定如何将它应用于这样的案例

我不关心行的顺序

干杯!

编辑:更新更清晰的所需输出.可能会在之前提交所需的答案,但不太清楚

Sot*_*tos 9

另一个想法使用dplyr,

library(dplyr)

df1 %>% 
 group_by(id) %>% 
 mutate(val = ifelse(row_number() == 1 & all(is.na(val)), 0, val)) %>% 
 na.omit()
Run Code Online (Sandbox Code Playgroud)

这使,

# A tibble: 5 x 2
# Groups:   id [2]
  id      val
  <fct> <dbl>
1 a         0
2 b         1
3 b         2
4 b         2
5 b         3
Run Code Online (Sandbox Code Playgroud)

  • (+1)似乎是这里最强大的答案.使用`replace(val,all(is.na(val))*1,0)`而不是`ifelse(...)`稍微简洁一些. (2认同)