组合不等长和非唯一值的向量

Dmi*_* I. 4 r sequence missing-data dataframe

我想做以下事情:

组合成一个数据框,两个向量

  • 有不同的长度
  • 包含在另一个载体中也发现的序列
  • 包含在另一个载体中找不到的序列
  • 在其他向量中找不到的序列永远不会超过3个元素
  • 总是有相同的第一个元素

数据帧应显示对齐的两个向量中的相等序列,如果向量缺少另一个向量中存在的序列,则列中的NA.

例如:

vector 1    vector 2                     vector 1        vector 2
   1           1                            a               a
   2           2                            g               g
   3           3                            b               b
   4           1            or              h               a
   1           2                            a               g
   2           3                            g               b   
   5           4                            c               h
               5                                            c
Run Code Online (Sandbox Code Playgroud)

应该组合成数据框架

    1   1                                    a   a
    2   2                                    g   g
    3   3                                    b   b
    4   NA                                   h   NA
    1   1                  or                a   a 
    2   2                                    g   g
    NA  3                                    NA  b
    NA  4                                    NA  h
    5   5                                    c   c
Run Code Online (Sandbox Code Playgroud)

我所做的是搜索合并,合并,cbind,plyr示例,但无法找到解决方案.我恐怕我需要开始用嵌套for循环编写一个函数来解决这个问题.

flo*_*del 6

注意 - 这是作为OP的第一个版本的答案而提出的.从那时起,这个问题就被修改了,但我认为这个问题仍然没有明确定义.


这是一个适用于您的integer示例的解决方案,也适用于numeric矢量.我也假设:

  • 两个载体含有相同数量的序列
  • 一个新的序列从哪里开始 value[i+1] <= value[i]

如果您的向量是非数字的,或者如果我的某个假设不符合您的问题,那么您必须澄清.

v1 <- c(1,2,3,4,1,2,5)
v2 <- c(1,2,3,1,2,3,4,5)

v1.sequences <- split(v1, cumsum(c(TRUE, diff(v1) <= 0)))
v2.sequences <- split(v2, cumsum(c(TRUE, diff(v2) <= 0)))

align.fun <- function(s1, s2) { #aligns two sequences
  s12 <- sort(unique(c(s1, s2)))
  cbind(ifelse(s12 %in% s1, s12, NA),
        ifelse(s12 %in% s2, s12, NA))
}

do.call(rbind, mapply(align.fun, v1.sequences, v2.sequences))
#       [,1] [,2]
#  [1,]    1    1
#  [2,]    2    2
#  [3,]    3    3
#  [4,]    4   NA
#  [5,]    1    1
#  [6,]    2    2
#  [7,]   NA    3
#  [8,]   NA    4
#  [9,]    5    5
Run Code Online (Sandbox Code Playgroud)

  • @DmitriiI.,如果你的两个向量是`numeric`(你称之为"十进制"),为什么你会有一个`integer`s的例子,然后编辑它以添加另一个带有`character`s的例子?如果它太多,您能提供真实数据或其中的一部分吗? (2认同)