我有以下框架数据集:
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
输出过程可以可视化为(我并不是要创建这样的图,此时只是为了更好地解释):
编辑: 由于以下两点,它并不是简单的 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/