我有一个非常简单的数据框,其中ID是一个数字序列,并且有多个组,其中开始/结束以开始/结束来表示:
ID = c(1:20)
group = c(NA,1,NA,NA,NA,1,NA,NA,NA,2,NA,NA,NA,NA,NA,2,NA,NA,NA,NA) %>% as.factor()
type = c(NA,"start",NA,NA,NA,"stop",NA,NA,NA,"start",NA,NA,NA,NA,NA,"stop",NA,NA,NA,NA) %>% as.factor()
df = data.frame(ID,group,type)
head(df)
ID group type
1 1 <NA> <NA>
2 2 1 start
3 3 <NA> <NA>
4 4 <NA> <NA>
5 5 <NA> <NA>
6 6 1 stop
我想用相邻的值在组中填充NA,并将数据帧分为开始/停止间隔之间的段:
ID group type
1 2 1 start
2 3 1 <NA>
3 4 1 <NA>
4 5 1 <NA>
5 6 1 stop
6 10 2 start
7 11 2 <NA>
8 12 2 <NA>
9 13 2 <NA>
10 14 2 <NA>
11 15 2 <NA>
12 16 2 stop
如果可以替换组中的缺失值,则可以将数据帧简单地减少为组中非NA的值。我看过tidyr::fill()
,但找不到一个好的解决方案。任何建议将不胜感激!
答案 0 :(得分:2)
我们可以fill
的“组”列中将NA
元素替换为前面的非NA元素,filter
根据“组”值将NA行中的{仍然不适用,按“组” slice
对行进行分组,直到“类型”列中的“停止”值为止(假设每个“组”有一个“开始/停止”组合)
library(tidyverse)
df %>%
fill(group) %>%
filter(!is.na(group)) %>%
group_by(group) %>%
slice(seq_len(which(type == "stop")))
# A tibble: 12 x 3
# Groups: group [2]
# ID group type
# <int> <fct> <fct>
# 1 2 1 start
# 2 3 1 <NA>
# 3 4 1 <NA>
# 4 5 1 <NA>
# 5 6 1 stop
# 6 10 2 start
# 7 11 2 <NA>
# 8 12 2 <NA>
# 9 13 2 <NA>
#10 14 2 <NA>
#11 15 2 <NA>
#12 16 2 stop