这句话有点难,据我所知,没有一个类似的问题回答了我的问题.
我有一个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()可能有所帮助,但不完全确定如何将它应用于这样的案例
我不关心行的顺序
干杯!
编辑:更新更清晰的所需输出.可能会在之前提交所需的答案,但不太清楚
另一个想法使用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)
这使,
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