首页 > 解决方案 > 从两个不同长度和唯一的向量创建一个由上升和交替元素组成的向量

问题描述

问题说明

给定两个可变长度的向量,并且向量之间或向量内没有重复,如何以升序和交替顺序有效地组合向量?

这是一个例子:

a <- c(98, 101, 104, 136, 154, 193)
b <- c(31, 37, 41, 44, 48, 55, 80, 118, 179)

预期的输出是

c(31, 98, 118, 136, 179, 193)
# b, a, b, a, b, a

你可以看到我们从 31 开始a,这是向量中最小的。紧随其后的是 98 b。然后从a,下一个大于 98 的数是 118。以此类推,结果:

A = 98, 136, 193
B = 31, 118, 179

我的尝试:

x <- c(min(a,b))
lastwas <- startedwithA <- ifelse(x %in% a, 1, 2)

for(i in 1:(length(a)+length(b))){
  if(lastwas == 2){
    x <- c(x, a[which(a > x[i])[1]])
    lastwas <- 1
  } else if(lastwas == 1){
    x <- c(x, b[which(b > x[i])[1]])
    lastwas <- 2
  } 
}
(x <- x[!is.na(x)]) 
# [1]  31  98 118 136 179 193

if(startedwithA == 1){
  evenodd <- c(T,F)
} else {
  evenodd <- c(F,T)
}
(A = x[evenodd]) 
# [1]  98 136 193
(B = x[!evenodd]) 
# [1]  31 118 179

有没有更好的方法来解决这个问题?

标签: r

解决方案


您可以根据向量设置名称前缀,

v <- sort(c(setNames(a, paste0("a", a)), setNames(b, paste0("b", b))))

和使用diff分解的初始字符。

res <- v[!!c(1, diff(as.numeric(as.factor(substr(names(v), 1, 1)))))]
res
# b31  a98 b118 a136 b179 a193 
# 31   98  118  136  179  193

然后拆分成一个数据框:

d <- as.data.frame(split(res, substr(names(res), 1, 1)))
d
#        a   b
# a98   98  31
# a136 136 118
# a193 193 179

数据

a <- c(98, 101, 104, 136, 154, 193)
b <- c(31, 37, 41, 44, 48, 55, 80, 118, 179)

推荐阅读