从两个不同长度和唯一向量创建上升和交替元素的向量

  • 本文关键字:向量 唯一 创建 元素 两个 r
  • 更新时间 :
  • 英文 :


问题解释

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

下面是一个示例:

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,向量之间的最小值。 其次是b的 98 .然后从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

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

你可以像这样使用data.frameorderdiff

a = c(98, 101, 104, 136, 154, 193)
b = c(31, 37, 41, 44, 48, 55, 80, 118, 179)
# Create a data frame for each vector with a different number in column 'set'
dfa = data.frame(val = a, set = 1)
dfb = data.frame(val = b, set = 2)
# Bind both together and order them by val   
df = rbind(dfa,dfb)
df = df[order(df$val),]
# Only keep those that have a diff different to 0
keep = c(1, diff(df$set)) != 0
result = df[keep,]

结果:

val set
7   31   2
1   98   1
14 118   2
4  136   1
15 179   2
6  193   1

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

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)

最新更新