【问题标题】:Create sequence between certain values across two vectors在两个向量的某些值之间创建序列
【发布时间】:2018-02-18 22:20:38
【问题描述】:

我目前正在尝试在长度不同的不同向量的值之间创建序列。

假设我有以下两个向量 a 和 b:

a<-c(1, 8, 14, 34, 46, 55)
b<-c(3, 6, 12, 13, 18, 42, 49, 50, 57, 200)

我想生成第三个向量,它显示a 的值和b 的下一个最高值之间的序列(这里:1:31,2,38:128,9,10,11,1214:18 作为14,15,16,17,18 等等,直到最后55:57 作为55,56,57)。

使用mapply 没有产生预期的结果。

【问题讨论】:

    标签: r vector sequence between


    【解决方案1】:

    我们可以使用findInterval根据'a'的值对'b'进行子集化,然后使用Map得到'a'的元素和子集元素之间的对应序列(:=) 'b'

    Map(`:`, a, b[findInterval(a, b) + 1])
    #[[1]]
    #[1] 1 2 3
    
    #[[2]]
    #[1]  8  9 10 11 12
    
    #[[3]]
    #[1] 14 15 16 17 18
    
    #[[4]]
    #[1] 34 35 36 37 38 39 40 41 42
    
    #[[5]]
    #[1] 46 47 48 49
    
    #[[6]]
    #[1] 55 56 57
    

    【讨论】:

    • 您好,我有一个迟到的附加询问:该代码对我 95% 的数据运行良好。但是,在某些情况下(与之前结构相同的输入数据),代码会导致“.Primitive(":")(dots[[1L]][[26L]],dots[[2L]][ [26L]]) :NA/NaN 参数”输出。我不明白为什么。 “NA/NaN Argument”似乎说没有要处理的数据,但我已经手动检查了前面的步骤。你对此有什么解释吗?
    • @sant 你能检查一下是否只有 NA/NaN 的情况。在这种情况下,请使用 if/else 条件来处理该问题
    • 是的,有整个列表不起作用。以最初帖子中的 a 和 b 为例:我运行了两个结构相似的列表,结果是 NA/NaN-Error。您能否指定包含 if/else 条件的方式?谢谢!
    • @sant 你能否更新一个可重现的小示例,以便我们在同一页面中
    【解决方案2】:
    lapply(a, function(x) x:b[b>x][1])
    #[[1]]
    #[1] 1 2 3
    
    #[[2]]
    #[1]  8  9 10 11 12
    
    #[[3]]
    #[1] 14 15 16 17 18
    
    #[[4]]
    #[1] 34 35 36 37 38 39 40 41 42
    
    #[[5]]
    #[1] 46 47 48 49
    
    #[[6]]
    #[1] 55 56 57
    

    【讨论】:

    • 不错的答案,最后的'[1]'是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多