r语言 - 列中含有0的连续序列的最大值



我有以下数据帧

id = 1:16
vals = c(0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,0)
cumsum  = c(0, 1, 2, 3, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 1, 0)
test = data.frame(id,vals, cumsum)

我想提取每个连续序列的test$ sum的最大值。例如,我可以对test的列和进行切片,这样我就有了连续的序列:

S1 = {0}
S2 = {1,2,3}
S3 = {0,0,0,0}
S4 = {1,2,3}
S5 = {0,0,0}
S6 = {1} 
S7 = {0}

可以看到,0将我的列分割成不同的序列。我想要返回的,是每个非零序列的最大值。所以我会得到

returned_vector <- c(3,3,1)

其中,第一项为S2的最大值(第一个非零序列),第二项为S4的最大值(第二个非零序列),第三项为S6的最大值(最后一个非零序列)

我不知道我该怎么做。基本上,我只想返回列test$cumsum中所有非零序列的最大值。

感谢任何帮助!

非常感谢!

有一种方法:

library(dplyr)
test %>% 
group_by(id = data.table::rleid(vals)) %>% 
summarise(max = ifelse(sum(vals) != 0,
list(max(cumsum, na.rm = TRUE)),
list(NULL))
) %>% 
pull(max) %>%
unlist
#> [1] 3 3 1
# the data
id = 1:16
vals = c(0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,0)
cumsum  = c(0, 1, 2, 3, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 1, 0)
test = data.frame(id,vals, cumsum)

由reprex包(v2.0.1)在2021-08-16创建

以下是dplyr的解决方案:

  1. 根据vals创建唯一的group_id
  2. group_id
  3. 中添加一个包含序列的列my.sequence
  4. filtersummarise
  5. 然后得到矢量my_result
library(dplyr)
test <- test %>% 
mutate(
group_id = cumsum(vals != lag(vals, def = first(vals)))
) %>% 
group_by(group_id) %>% 
mutate(my.sequence = row_number()) %>% 
filter(vals ==1) %>% 
summarise(result = max(my.sequence)) 
my_result <- test$result
my_result

输出:

[1] 3 3 1

最新更新