gpt4 book ai didi

r - 由连字符组成的数字序列,没有连字符的单个出现

转载 作者:行者123 更新时间:2023-12-04 08:45:57 37 4
gpt4 key购买 nike

我想生成可读的数字序列(例如 1, 2, 3, 4 = 1-4 ),但是对于序列中的每个数字必须有四位数字的一组数据(例如 99 = 00991 = 00011022 = 1022 )并且其中有不同的字母在每个数字前面。
我在看 answer到此 question ,这几乎完全符合我的要求,但有两个警告:

  • 如果有一个没有出现在序列中的独立号码,它会出现两次,中间有一个连字符
  • 如果有多个未出现在序列中的独立数字,则它们不会包含在结果中
  • ### Create Data Set ====
    ## Create the data for different tags. I'm only using two unique levels here, but in my dataset I've got
    ## 400+ unique levels.
    FM <- paste0('FM', c('0001', '0016', '0017', '0018', '0019', '0021', '0024', '0026', '0028'))
    SC <- paste0('SC', c('0002', '0003', '0004', '0010', '0012', '0014', '0033', '0036', '0039'))

    ## Combine data
    my.seq1 <- c(FM, SC)

    ## Sort data by number in sequence
    my.seq1 <- my.seq1[order(substr(my.seq1, 3, 7))]

    ### Attempt Number Sequencing ====
    ## Get the letters
    sp.tags <- substr(my.seq1, 1, 2)

    ## Get the readable number sequence
    lapply(split(my.seq1, sp.tags), ## Split data by the tag ID
    function(x){

    ## Get the run lengths as per [previous answer][1]
    rl <- rle(c(1, pmin(diff(as.numeric(substr(x, 3, 7))), 2)))

    ## Generate number sequence by separator as per [previous answer][1]
    seq2 <- paste0(x[c(1, cumsum(rl$lengths))], c("-", ",")[rl$values], collapse="")

    return(substr(seq2, 1, nchar(seq2)-1))
    })

    ## Combine lists and sort elements
    my.seq2 <- unlist(strsplit(do.call(c, my.seq2), ","))
    my.seq2 <- my.seq2[order(substr(my.seq2, 3, 7))]
    names(my.seq2) <- NULL

    my.seq2
    [1] "FM0001-FM0001" "SC0002-SC0004" "FM0016-FM0019" "FM0028" "SC0039"

    my.seq1
    [1] "FM0001" "SC0002" "SC0003" "SC0004" "SC0010" "SC0012" "SC0014" "FM0016" "FM0017" "FM0018" "FM0019" "FM0021"
    [13] "FM0024" "FM0026" "FM0028" "SC0033" "SC0036" "SC0039"

    这方面的主要问题是:
  • 数据集中完全缺少某些值(例如 FM0021FM0024FM0026 )
  • 序列中的第一个数字 ( FM0001 ) 出现在
  • 之间,中间有一个连字符

    使用 A5C1D2H2I1M1N2O1R2T1 感觉暖和了的 answer使用 seqToHumanReadable因为它非常优雅并且解决了这两个问题。另外两个问题是我无法在每个数字之前标记 ID,也无法将数字强制为四(例如 0004 变成 4 )。
    library(R.utils)

    lapply(split(my.seq1, sp.tags), function(x){
    return(unlist(strsplit(seqToHumanReadable(substr(x, 3, 7)), ',')))
    })

    $FM
    [1] "1" " 16-19" " 21" " 24" " 26" " 28"

    $SC
    [1] "2-4" " 10" " 12" " 14" " 33" " 36" " 39"
    理想情况下,结果是:
    "FM0001, SC002-SC004, SC0012, SC0014, FM0017-FM0019, FM0021, FM0024, FM0026, FM0028, SC0033, SC0036, SC0039"
    有任何想法吗?这是手工操作非常简单但需要很长时间才能完成的事情之一,您可能认为会存在一个函数,但我还没有找到它或者它不存在 :(

    最佳答案

    这应该怎么办?

    # get the prefix/tag and number
    tag <- gsub("(^[A-z]+)(.+)", "\\1", my.seq1)
    num <- gsub("([A-z]+)(\\d+$)", "\\2", my.seq1)

    # get a sequence id
    n <- length(tag)
    do_match <- c(FALSE, diff(as.numeric(num)) == 1 & tag[-1] == tag[-n])
    seq_id <- cumsum(!do_match) # a sequence id

    # tapply to combine the result
    res <- setNames(tapply(my.seq1, seq_id, function(x)
    if(length(x) < 2)
    return(x)
    else
    paste(x[1], x[length(x)], sep = "-")), NULL)

    # show the result
    res
    #R> [1] "FM0001" "SC0002-SC0004" "SC0010" "SC0012" "SC0014" "FM0016-FM0019" "FM0021"
    #R> [8] "FM0024" "FM0026" "FM0028" "SC0033" "SC0036" "SC0039"

    # compare with
    my.seq1
    #R> [1] "FM0001" "SC0002" "SC0003" "SC0004" "SC0010" "SC0012" "SC0014" "FM0016" "FM0017" "FM0018" "FM0019" "FM0021" "FM0024"
    #R> [14] "FM0026" "FM0028" "SC0033" "SC0036" "SC0039"
    数据
    FM <- paste0('FM', c('0001', '0016', '0017', '0018', '0019', '0021', '0024', '0026', '0028'))
    SC <- paste0('SC', c('0002', '0003', '0004', '0010', '0012', '0014', '0033', '0036', '0039'))
    my.seq1 <- c(FM, SC)
    my.seq1 <- my.seq1[order(substr(my.seq1, 3, 7))]

    关于r - 由连字符组成的数字序列,没有连字符的单个出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64329590/

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