r - 检测具有连续 1/TRUE 的行序列何时开始和结束 R dplyr
问题描述
我需要检测ice
由另一个变量排序的变量行的位置,该变量day
具有 5 个或更多连续行TRUE
da <- tibble(day=1:365,ice=runif(365)>.8)
da$ice[140:143] <- TRUE
da$ice[150:156] <- TRUE
da$ice[180:184] <- TRUE
day
我在 data.frame 中添加了一些噪音,但是当变量上有 5 个或更多TRUE
s时,我需要检测第一个块的第一天ice
,最后一个块的最后一天,在示例中为day
150 和day
184 .
我会使用这样的循环
first_day <- 0
for(i in 1:(nrow(da)-5))
{
if(sum(da$ice[i:(i+5)])==5){
first_day <- da$day[i]
print(first_day)
}
}
这只是第一次尝试效果不佳,但无法弄清楚如何使用 dplyr 或没有循环的 base R 来做到这一点。
解决方案
我们根据'ice'的值创建一个分组变量run-length-id
,然后'ice'filter
的all
值为TRUE并且行数(n()
)大于或等于5的行,ungroup
以及slice
第一行和最后一行
library(dplyr)
library(data.table)
da %>%
group_by(grp = rleid(ice)) %>%
filter(all(ice), n() >= 5) %>%
ungroup %>%
slice(c(1, n()))
-输出
# A tibble: 2 x 3
# day ice grp
# <int> <lgl> <int>
#1 150 TRUE 46
#2 184 TRUE 58
或者一个选项data.table
library(data.table)
range(setDT(da)[, day[all(ice) & .N >= 5], rleid(ice)]$V1)
#[1] 150 184
推荐阅读
- macos-big-sur - macOS 上的文件提供程序 API:如何初始化?
- html - 如何解决与正文内容重叠的页脚?
- react-native - 动画启动失败 REACT-NATIVE
- sql-server - 如果字符串为空,则 T-SQL 多个 WHERE 子句
- macos - 如何在 Xamarin.mac 和 Visual Studio 中使用僵尸对象
- grpc - 努力使 gRPC-web 和 HTTPS 工作
- css - Vaadin + Css 格式化
- python - 索引上的 Dask.dataframe.merge 出乎意料地慢
- react-native - 如何在博览会管理的工作流程中以原生反应显示 360 度图像
- python - 如何在 python 中将 epsg:28992 转换为 epsg:3857 以获得匀称的多边形