获取包含 R 中连续特定值计数的向量
Get a vector with the count of consecutive specific values in R
我有一个如下所示的数据框:
(TimeDate,Movement,Booked)
1 2017-01-02 09:00:13 FALSE TRUE
2 2017-01-02 09:01:13 FALSE TRUE
3 2017-01-02 09:02:15 TRUE TRUE
4 2017-01-02 09:03:13 TRUE TRUE
5 2017-01-02 09:04:13 FALSE FALSE
6 2017-01-02 09:05:13 FALSE FALSE
7 2017-01-02 09:06:13 FALSE TRUE
8 2017-01-02 09:07:13 FALSE TRUE
9 2017-01-02 09:08:14 TRUE TRUE
10 2017-01-02 09:09:13 FALSE TRUE
它有一个逐分钟的日志,其中有两个布尔值对应于检测到的移动和预订的房间。我想要获得的是一个向量,它计算 Movement 和 Booked comumns 的 (FALSE,TRUE) 的连续出现次数,所以在这种情况下,我想要一个像这样的结果向量:
c(2,2,1)
第一个元素是第 1 行和第 2 行的计数,第二个元素是第 7 行和第 8 行的计数,最后一个元素是第 10 行的计数。
老实说,我什至不知道如何开始。
谢谢!
这是 rleid
的一个选项,我们根据 'Movement' 中的 FALSE 和 Booked TRUE 创建分组列,得到 count
列的
library(dplyr)
library(data.table)
df1 %>%
mutate(rl = rleid(!Movement, Booked)) %>%
filter(!(! Movement & Booked)) %>%
count(rl) %>%
pull(n)
#[1] 2 2 1
或 rle
来自 base R
with(df1, with(rle(paste(Movement, Booked)), lengths[values == 'FALSE TRUE']))
#[1] 2 2 1
或者使用紧凑的方式
with(df1, table(rleid(Movement, Booked)[!Movement & Booked]))
#1 4 6
#2 2 1
数据
df1 <- structure(list(TimeDate = c("2017-01-02 09:00:13", "2017-01-02 09:01:13",
"2017-01-02 09:02:15", "2017-01-02 09:03:13", "2017-01-02 09:04:13",
"2017-01-02 09:05:13", "2017-01-02 09:06:13", "2017-01-02 09:07:13",
"2017-01-02 09:08:14", "2017-01-02 09:09:13"), Movement = c(FALSE,
FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE),
Booked = c(TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE,
TRUE, TRUE)), class = "data.frame", row.names = c("1", "2",
"3", "4", "5", "6", "7", "8", "9", "10"))
这个怎么样?对于每一行,检查您是否获得正确的序列,然后使用 rle
.
xy <- read.table(text = "FALSE TRUE
FALSE TRUE
TRUE TRUE
TRUE TRUE
FALSE FALSE
FALSE FALSE
FALSE TRUE
FALSE TRUE
TRUE TRUE
FALSE TRUE", header = FALSE)
colnames(xy) <- c("Movement", "Booked")
out <- rle(apply(xy, MARGIN = 1, FUN = function(x) !isTRUE(x[1]) & isTRUE(x[2])))
out$lengths[out$values == TRUE]
[1] 2 2 1
另一个更简单的选择是
out <- rle(xy$Movement == FALSE & xy$Booked == TRUE)
out$lengths[out$values == TRUE]
编辑:发帖时没有看到Roman的相同解决方案。
我们想要这样的东西:
tmp <- rle(with(df, !Movement & Booked))
tmp$lengths[tmp$values]
tmp$values
的索引确保您只获得与您指定的模式相对应的行。
希望对您有所帮助!
我有一个如下所示的数据框:
(TimeDate,Movement,Booked)
1 2017-01-02 09:00:13 FALSE TRUE
2 2017-01-02 09:01:13 FALSE TRUE
3 2017-01-02 09:02:15 TRUE TRUE
4 2017-01-02 09:03:13 TRUE TRUE
5 2017-01-02 09:04:13 FALSE FALSE
6 2017-01-02 09:05:13 FALSE FALSE
7 2017-01-02 09:06:13 FALSE TRUE
8 2017-01-02 09:07:13 FALSE TRUE
9 2017-01-02 09:08:14 TRUE TRUE
10 2017-01-02 09:09:13 FALSE TRUE
它有一个逐分钟的日志,其中有两个布尔值对应于检测到的移动和预订的房间。我想要获得的是一个向量,它计算 Movement 和 Booked comumns 的 (FALSE,TRUE) 的连续出现次数,所以在这种情况下,我想要一个像这样的结果向量:
c(2,2,1)
第一个元素是第 1 行和第 2 行的计数,第二个元素是第 7 行和第 8 行的计数,最后一个元素是第 10 行的计数。
老实说,我什至不知道如何开始。 谢谢!
这是 rleid
的一个选项,我们根据 'Movement' 中的 FALSE 和 Booked TRUE 创建分组列,得到 count
列的
library(dplyr)
library(data.table)
df1 %>%
mutate(rl = rleid(!Movement, Booked)) %>%
filter(!(! Movement & Booked)) %>%
count(rl) %>%
pull(n)
#[1] 2 2 1
或 rle
来自 base R
with(df1, with(rle(paste(Movement, Booked)), lengths[values == 'FALSE TRUE']))
#[1] 2 2 1
或者使用紧凑的方式
with(df1, table(rleid(Movement, Booked)[!Movement & Booked]))
#1 4 6
#2 2 1
数据
df1 <- structure(list(TimeDate = c("2017-01-02 09:00:13", "2017-01-02 09:01:13",
"2017-01-02 09:02:15", "2017-01-02 09:03:13", "2017-01-02 09:04:13",
"2017-01-02 09:05:13", "2017-01-02 09:06:13", "2017-01-02 09:07:13",
"2017-01-02 09:08:14", "2017-01-02 09:09:13"), Movement = c(FALSE,
FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE),
Booked = c(TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE,
TRUE, TRUE)), class = "data.frame", row.names = c("1", "2",
"3", "4", "5", "6", "7", "8", "9", "10"))
这个怎么样?对于每一行,检查您是否获得正确的序列,然后使用 rle
.
xy <- read.table(text = "FALSE TRUE
FALSE TRUE
TRUE TRUE
TRUE TRUE
FALSE FALSE
FALSE FALSE
FALSE TRUE
FALSE TRUE
TRUE TRUE
FALSE TRUE", header = FALSE)
colnames(xy) <- c("Movement", "Booked")
out <- rle(apply(xy, MARGIN = 1, FUN = function(x) !isTRUE(x[1]) & isTRUE(x[2])))
out$lengths[out$values == TRUE]
[1] 2 2 1
另一个更简单的选择是
out <- rle(xy$Movement == FALSE & xy$Booked == TRUE)
out$lengths[out$values == TRUE]
编辑:发帖时没有看到Roman的相同解决方案。
我们想要这样的东西:
tmp <- rle(with(df, !Movement & Booked))
tmp$lengths[tmp$values]
tmp$values
的索引确保您只获得与您指定的模式相对应的行。
希望对您有所帮助!