首页 > 解决方案 > R对连续重复的奇数列表求和并删除除第一个列表之外的所有列表

问题描述

我被问题困住了。如何加入连续重复的奇数列表并删除除第一个列表之外的所有列表。我已经学会了如何对连续重复的行求和并删除除第一行之外的所有行(链接:R 对连续重复的奇数行求和并删除除第一行之外的所有行)。但是这个项目,我想加入连续重复的奇数列表,但不是所有的连续重复列表。

data.table 或 dplyr 会很好

例如:

ia<-c(1,1,2,2,1,1,1,1)
time <- list(c(23,43),
             c(24,54,32), 
             c(23,43,232), 
             c(24,54,32),
             c(23,43,2), 
             c(24,54,32),
             c(24,54,32),
             c(24,54,32)
            )

res_time <- list(c(23,43,24,54,32), # 1+1
                 c(23,43,232),      # 2
                 c(24,54,32),       # 2
                 c(23,43,2,24,54,32,24,54,32,24,54,32) # 1+1+1+1
                 )

谢谢!

标签: r

解决方案


这个“几乎”给出了仅使用基数 R 的预期输出。我们使用创建分组序列diff。为了交替选择组,我们递归地创建一个交替TRUE/FALSE值序列,并基于这个值,我们unlist将列表值组合在mapply.

pat <- cumsum(c(0, diff(ia)) != 0)

mapply(function(x, y) if(y) unlist(time[x]) else time[x], 
 split(seq_along(time), pat), rep(c(TRUE, FALSE), length.out = length(unique(pat))))


#$`0`
#[1] 23 43 24 54 32

#$`1`
#$`1`[[1]]
#[1]  23  43 232

#$`1`[[2]]
#[1] 24 54 32


#$`2`
# [1] 23 43  2 24 54 32 24 54 32 24 54 32

推荐阅读