加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

连接组中的矢量元素

发布时间:2020-12-15 04:09:52 所属栏目:Java 来源:网络整理
导读:将list1转换为list2以及list2转换为list1的最优雅方式是什么? list1- c('a','b','c','d','e','f','g','h','i')list2- c('abc','def','ghi') 即:以三个为一组的连续元素. 感谢:D 解决方法 设list1 - letters [1:10](显示当向量的长度不是3的倍数时它是如何
将list1转换为list2以及list2转换为list1的最优雅方式是什么?

list1<- c('a','b','c','d','e','f','g','h','i')
list2<- c('abc','def','ghi')

即:以三个为一组的连续元素.

感谢:D

解决方法

设list1< - letters [1:10](显示当向量的长度不是3的倍数时它是如何工作的).然后,试试这个: list1到list2

# method 1 (seems to be the fastest so far,# my suspicions about loop being slower were wrong)
list2 <- sapply(split(list1,(seq_along(list1)-1) %/% 3),paste,collapse = "")
# alternatively as @flodel mentions
list2 <- tapply(list1,(seq_along(list1)-1) %/% 3,collapse = "")

tapply版本在与sapply split相似的时间运行(基准测试未显示).

更进一步,在this post中使用@JoshOBrien的想法

# method 2
pattern <- "(?<=[[:alnum:]]{3})(?=[[:alnum:]])"
strsplit(paste(list1,collapse=""),pattern,perl=TRUE)[[1]]
# [1] "abc" "def" "ghi" "j"

如果你想把最后一部分连接到最后一个(这里是j到ghi),那么,做:

pattern <- "(?<=[[:alnum:]]{3})(?=[[:alnum:]]{3})"
strsplit(paste(list1,perl=TRUE)[[1]]
# [1] "abc"  "def"  "ghij"

list2到list1

unlist(strsplit(list2,""),use.names=FALSE)
#  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

这是方法1,方法2和eddi的基准测试:

数据:

list1 <- sample(letters,1e5,replace=TRUE)

功能:

arun <- function() {
    pattern <- "(?<=[[:alnum:]]{3})(?=[[:alnum:]])"
    strsplit(paste(list1,perl=TRUE)[[1]]
}

arun2 <- function() {
    unname(sapply(split(list1,collapse = ""))
}

eddi <- function() {
    substring(paste(list1,collapse = ""),seq(1,length(list1),3),pmin(seq(3,length(list1)+2,length(list1)))    
}

基准测试:

require(microbenchmark)
microbenchmark(t1 <- arun(),t2 <- eddi(),t3 <- arun2(),times=10)
identical(t1,t2) # TRUE
identical(t1,t3) # TRUE

# Unit: milliseconds
#           expr       min        lq    median        uq       max neval
#   t1 <- arun() 3352.9867 3400.8627 3512.7037 3585.6499 3635.2182    10
#   t2 <- eddi() 3302.0925 3318.4184 3356.2109 3409.9728 3487.7220    10
#  t3 <- arun2()  474.9235  494.7407  539.4406  641.2605  907.9072    10

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读