r - 按开始/停止间隔组将列拆分为段
问题描述
我有一个非常简单的数据框,其中 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()
,但找不到好的解决方案。任何建议将不胜感激!
解决方案
我们可以fill
将 'group' 列中的NA
元素替换为前面的非 NA 元素,filter
根据仍然为 NA 的 'group' 值取出 NA 行,按 'group'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
推荐阅读
- sql - 在 SQL 上使用 GROUP BY 来获取我的交易表的摘要(买卖)
- c# - NLog - 如何配置有条件地写入数据库以及电子邮件异常和文件异常
- python - 熊猫滚动:聚合布尔值
- r - dplyr mutate:传递变量列表以创建多个新变量
- r - 如何阅读 R 中的摘要结果?
- typescript - 在另一个接口中使用 Typescript 接口的一个属性
- python - Sklearn SGDClassifier“找到暗淡3的数组。估计器预期<= 2”与重塑MNIST后
- python - 在 python 文件中播放录制的音频不起作用
- python - 如何从一个字符串中生成多个变量
- c# - 使用分隔符加入剃刀输出