r - 匹配两个向量的子串并创建一个组合它们的新向量

标签 r vector

考虑两个向量。

a <- c(123, 234, 432, 223)
b <- c(234, 238, 342, 325, 326)

现在,我想匹配 a 的最后两位数字到 b 的前两位数字并创建一个新的矢量粘贴 a 的第一位数字, b 的匹配部分和最后一位数字.我的预期输出是:
[1] 1234 1238 2342 4325 4326 2234 2238

为简单起见,考虑所有元素的长度始终为 3。

我试过了 :
sub_a <- substr(a, 2, 3)   #get last two digits of a
sub_b <- substr(b, 1, 2)   #get first two digits of b
common <- intersect(sub_a, sub_b) 
common给了我 a 中的共同元素和 b哪个是 :
[1] "23" "34" "32"

然后我使用 matchpaste0在一起,我得到不完整的输出。
paste0(a[match(common, sub_a)], substr(b[match(common, sub_b)], 3, 3))
#[1] "1234" "2342" "4325"

match只匹配第一次出现。

我怎样才能达到我的预期输出?

最佳答案

一个可能的解决方案:

a <- setNames(a, substr(a, 2, 3))
b <- setNames(b, substr(b, 1, 2))

df <- merge(stack(a), stack(b), by = 'ind')
paste0(substr(df$values.x, 1, 1), df$values.y)

这使:

[1] "1234" "1238" "2234" "2238" "4325" "4326" "2342"


第二种选择:
a <- setNames(a, substr(a, 2, 3))
b <- setNames(b, substr(b, 1, 2))

l <- lapply(names(a), function(x) b[x == names(b)])
paste0(substr(rep(a, lengths(l)), 1, 1), unlist(l))

这给出了相同的结果并且速度要快得多(参见 the benchmark )。

关于r - 匹配两个向量的子串并创建一个组合它们的新向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47431111/

相关文章:

r - 将整齐的选择参数传递给内部函数,同时维护 "missingness"

r - 填充缺失值

R 与 postgresql 数据库

arrays - Haskell 中具有高性能的可变、随机访问数组/向量

c++ - 在 ctor 中使用 const vector 初始化的 const vector 成员

R减小图表大小并从ggplot中删除灰色背景

r - R 中用于 OPTICS 实现的优先级队列

c++ - 具有 Boost 格式的 int 特征向量的格式化 cout

c++ - CUDA - STL vector 在传递给使用 nvcc 编译的类时损坏

scala - Scala 库方法 Vector.sorted 使用什么算法?