gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:21:28 26 4
gpt4 key购买 nike

考虑两个向量。

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com