r - 将 r 中较小的序列映射(对齐)到较大的序列

标签 r sorting dataset alignment

我有以下框架数据集:

master <- data.frame (namest = c("A","B", "C","D", "E", "F"), 
 position =c( 0, 10, 20, 25, 30, 35))
master
      namest position
    1      A        0
    2      B       10
    3      C       20
    4      D       25
    5      E       30
    6      F       35

这是更大的 map (例如路线图),其中有地点和位置的名称。现在,在第二次调查中,我们有更小的子集(很多,这里只有 3 个)。

subset1 <- data.frame (namest = c("I", "A", "ii", "iii", "B"), 
 position = c(0, 10, 12, 14, 20))  
subset1
  namest position
1      I        0
2      A       10
3     ii       12
4    iii       14
5      B       20

subset2 <- data.frame (namest = c("E", "vii", "F"), position = c(0, 3,5))
 subset2
  namest position
1      E        0
2    vii        3
3      F        5

subset3 <- data.frame (namest = c("D", "vi", "v", "C", "iv"), 
   position = c(0, 2, 3, 5, 8))
subset3
  namest position
1      D        0
2     vi        2
3      v        3
4      C        5
5     iv        8

您可以看到每个子集都有两个主控通用的名称,例如subset3 中的D 和C。

现在我想结合这些子集来制作更详细的母版。意味着新的名字将被放置在新的 map 中。看到一些子集(参见子集3)与主集相比具有相反的顺序。

因此预期输出是:

subsetalign <- data.frame(subsett = c(rep ("A-B", nrow(subset1)),
rep("C-D", nrow(subset3)), 
rep("E-F", nrow(subset2))), namest =  c(c("I", "A", "ii", "iii", "B"), 
rev (c("D", "vi", "v", "C", "iv")),c("E", "vii", "F")), 
position = c(subset1$position, rev (subset3$position), subset2$position))

 subsetalign
   subsett namest position
1      A-B      I        0
2      A-B      A       10
3      A-B     ii       12
4      A-B    iii       14
5      A-B      B       20
6      C-D     iv        8
7      C-D      C        5
8      C-D      v        3
9      C-D     vi        2
10     C-D      D        0
11     E-F      E        0
12     E-F    vii        3
13     E-F      F        5

输出过程可以可视化为(我并不是要创建这样的图,此时只是为了更好地解释):

enter image description here

编辑: 由于以下两点,它并不是简单的 rbind:

(a) 子集根据其公共(public)名称在主文件中的排列方式进行排序。 例如子集1 (A-B) + 子集3 (C-D) + 子集2 (E-F),因为master中的顺序是A-B-C-D-E-F

(b) 此外,如果子集的顺序与主集的顺序相反,则应将它们颠倒过来。 在子集3中,namest的顺序是“D”-“vi”-“v”-“C”-“iv”,但在master中D在C之后,所以这个sustet 3在绑定(bind)之前应该颠倒过来。

最佳答案

假设子集在列表中

subsets <- list(subset1, subset2, subset3)

母版中 anchor 的位置是

idx <- lapply(subsets, function(x, y) match(x$namest, y$namest), master)

每个子集的方向是

orientation <- sapply(idx, function(elt) unique(diff(elt[!is.na(elt)])))

并且在master中的位置是

position <- sapply(idx, function(elt) min(elt, na.rm=TRUE))

可以对子集进行排序subsets[order(position)],必要时可以反转

updt <- Map(function(elt, dir) {
    if (dir == -1)
        elt[rev(seq_len(nrow(elt))),] 
   else elt
}, subsets[order(position)], orientation[order(position)])

rbind结合在一起,do.call(rbind, updt)。这是假设 master 中的所有间隔都只表示一次。

关于r - 将 r 中较小的序列映射(对齐)到较大的序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10870655/

相关文章:

R:重新思考数据(如何重新排列一组列中的一列?)

r - 集成()给出了完全错误的数字

c# - 如何循环遍历数据集(来自存储过程)并检查每行的单个字段

c# - 覆盖数据集设计器类中定义的 XmlRoot 属性

algorithm - 何时可以使用数字索引进行排序的最佳方法?

.net - XML 中包含空值的类型化数据集

R:将一个因素的水平应用于另一个对象?

function - R:使用分位数 0.05 和 0.95 对数据框中的每一列进行异常值清理

解决这个迷宫游戏的算法

ios - NSPredicate 使用列表中的任何对象搜索数组 |对象C