r - 在二进制列 r 中寻找模式
问题描述
我需要找到并计算在 3 个或更多连续零之后出现 1 的 ID。
这是我所拥有的一个例子:
# ID Jan Feb Mar Apr May Jun Jul Aug Sept Oct
# 1 0 0 0 1 0 0 1 1 1 0
# 2 0 0 0 0 0 0 1 0 0 0
# 3 0 0 0 0 0 0 0 0 0 1
# 4 1 0 0 1 0 1 0 1 0 1
# 5 0 0 1 0 0 1 1 0 0 1
c1<- c("ID","Jan","Feb", "Mar","Apr", "May","Jun", "Jul", "Aug", "Sept", "Oct")
c2<- c(1,0,0,0,1,0,0,1,1,1,0)
c3<- c(2,0,0,0,0,0,0,1,0,0,0)
c4<- c(3,0,0,0,0,0,0,0,0,0,1)
c5<- c(4,1,0,0,1,0,1,0,1,0,1)
c6<- c(5,0,0,1,0,0,1,1,0,0,1)
BD<-data.frame(rbind(c2,c3,c4,c5,c6))
colnames(BD)<-c1
我期望的结果是这样的:
# ID Jan Feb Mar Apr May Jun Jul Aug Sept Oct
# 1 0 0 0 1 0 0 1 1 1 0
# 2 0 0 0 0 0 0 1 0 0 1
# 3 0 0 0 0 0 0 0 0 0 1
有人知道该怎么做吗?谢谢!
解决方案
如果您采用rowid(rleid(x))
向量x
,您将获得每个“运行”的步数,每个元素是*。您可以检查它是否 >= 3 且元素为 0。如果前一个元素(对于移位输出)为真且元素为 1,则返回 TRUE。然后检查any
该行中的元素是否为 TRUE。
library(data.table)
rows <-
apply(BD, 1, function(r) any(shift(rowid(rleid(r)) >= 3 & r == 0) & r == 1))
BD[rows,]
# ID Jan Feb Mar Apr May Jun Jul Aug Sept Oct
# c2 1 0 0 0 1 0 0 1 1 1 0
# c3 2 0 0 0 0 0 0 1 0 0 0
# c4 3 0 0 0 0 0 0 0 0 0 1
* 这是特定行的示例(第一行)
rbind(
rowid_rleid = rowid(rleid(unlist(BD[1,]))),
original = unlist(BD[1,]))
# ID Jan Feb Mar Apr May Jun Jul Aug Sept Oct
# rowid_rleid 1 1 2 3 1 1 2 1 2 3 1
# original 1 0 0 0 1 0 0 1 1 1 0
推荐阅读
- java - Why is the time difference off when subtracting the same date from two different time zones?
- javascript - 多个 url 变量 async/await axios
- mysql - SQL:统计每辆车的年龄数
- laravel - 未捕获的错误:您没有设置有效的可发布密钥。使用您的可发布密钥调用 Stripe.setPublishableKey()。一切都很好配置
- c# - 使用 C# 的 Lucene 搜索词
- godot - Godot 引擎:Light2d 与重叠的瓷砖混合在部分下方
- gps - 在 JS 中获取准确定位数据的最佳方法
- python - 使用 Python 根据另一列上的类别将一列切割成分位数
- apache - 简单的重写规则在 Apache 服务器上不起作用
- vba - 通过 VBA 连接到 SQL Server