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
,这是向量中最小的。紧随其后的是 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
有没有更好的方法来解决这个问题?
解决方案
您可以根据向量设置名称前缀,
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)
推荐阅读
- python - 如何在python中设计一个可扩展的查询字符串排序方法?
- python - 第一行输入获取不到
- java - 代号一个日历视图无法更改当前日期的文本
- javascript - 任何人都可以帮我解决这个 javascript console.log 问题吗?
- python - 枚举数据加载器时出现 KeyError - 为什么?
- windows - 查找容器 id 并停止 docker 容器的 bat 脚本语法是什么
- c++ - 重载 [] 和 = 运算符以在 C++ 中接受我的模板类的值
- reactjs - React-router-dom 链接不开玩笑地更新历史记录
- scala - 是否可以使用类型类来实现特征?
- javascript - 如何使用画布在图像中绘制选择区域