8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

将序数转换为数字

SingleNegationElimination 3月前

72 0

是否有内置方法将序数转换为数字向量?ordinal <- c(\'First\', \'Third\', \'Second\')ordinal_to_numeric(ordinal)#[1] 1 3 2ordinal2 <...

是否有内置方法将序数转换为数字向量?

ordinal <- c("First", "Third", "Second")
ordinal_to_numeric(ordinal)
#[1] 1 3 2

ordinal2 <- c("1st", "4th", "2nd")
ordinal_to_numeric(ordinal)
#[1] 1 4 2

人们确实可以创建一本字典,但这很容易变得麻烦。

帖子版权声明 1、本帖标题:将序数转换为数字
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由SingleNegationElimination在本站《string》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我使用 importlib.import_module() 从不同的文件夹导入模块,但它只识别顶级目录名称。这是我的环境。测试中有三个文件夹 a、b、c

    我习惯 importlib.import_module() 从不同的文件夹导入模块,但它只识别顶级目录名称。这是我的环境。

    test目录下有a、b、c三个文件夹

    (py312) root@ubuntu2004-host:~# tree test/
    test/
     a
        aa
           aaa
               aaaa
        a.py
     b
     c
         cxxx.py
    
    6 directories, 2 files
    

    a.py的代码如下

    import importlib
    import sys
    
    print(sys.path)
    params=importlib.import_module('c.cxxx')
    params.args
    params.C
    

    c.py的代码如下

    args = {'a': 1}
    
    class C:
    def C(self):
      pass
    

    执行a.py的时候总是报错 ModuleNotFoundError: No module named 'c' ,意思是识别的是目录c,而不是模块cxxx

    (py312) root@ubuntu2004-host:~/test# python3.12 a/a.py 
    ['/root/test/a', '/usr/lib/python312.zip', '/usr/lib/python3.12', '/usr/lib/python3.12/lib-dynload', '/usr/local/lib/python3.12/dist-packages', '/usr/lib/python3/dist-packages']
    Traceback (most recent call last):
      File "/root/test/a/a.py", line 5, in <module>
        params=importlib.import_module('c.cxxx')
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/lib/python3.12/importlib/__init__.py", line 90, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
      File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
      File "<frozen importlib._bootstrap>", line 1310, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
      File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
      File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
      File "<frozen importlib._bootstrap>", line 1324, in _find_and_load_unlocked
    ModuleNotFoundError: No module named 'c'
    

    原来的python版本是3.11。我也尝试了Python 3.12.4和3.8,但它们也给出了同样的错误。

  • 你好。那么你的问题是什么?/root/test 不在路径中,路径中没有这样的模块,所有检查都失败了。你甚至可以打印路径,这样你就能知道里面有什么。

  • Nat 3月前 0 只看Ta
    引用 4

    啊,你说得对——出于某种原因我记得它是双向的。总是可以生成一个字典并匹配回来。不确定你的序数范围是多少。

  • 如何更新 HierarchyPosition 实体?尝试 PATCH PositionHierarchies 时出现此错误:{\'Message\': \'未找到与请求匹配的 HTTP 资源...

    如何更新 HierarchyPosition 实体?

    当尝试 PATCH PositionHierarchies 时出现此错误:

    {\'Message\':\'未找到与请求 URI'https://xxxxx.operations.dynamics.com/data/PositionHierarchies(PositionId='xxx',HierarchyTypeName='xxx',ValidFrom=2018-09-26T05:00:00Z,ValidTo=2154-11-31T00:00:00Z)'匹配的 HTTP 资源。未找到此请求的路由数据。\' }

    实体的定义方式如下:

    enter image description here

    我还尝试使用以下方法用 C# 更新该实体 etag

            string entityId = retrievedEntity["@odata.etag"]?.ToString();
            if (string.IsNullOrEmpty(entityId))
            {
                _logger.LogError("Retrieved entity does not have a valid identifier.");
                return (false, "Retrieved entity does not have a valid identifier.");
            }
    
            _logger.LogInformation($"Attempting to update PositionHierarchy with ID: {entityId}.");
    
            var content = new StringContent(JsonConvert.SerializeObject(updatedEntityData), Encoding.UTF8, "application/json");
            var patchResponse = await _httpClient.PatchAsync($"/data/PositionHierarchies({entityId})", content);
            var patchResponseBody = await patchResponse.Content.ReadAsStringAsync();
    

    但出现此错误

    无法更新 ID 为 W/\'xxxxxxxxxxx=\' 的 PositionHierarchy:{\'Message\':\'未找到与请求 URI'https://xxxxxx.operations.dynamics.com/data/PositionHierarchies(W/\'xxxxxxxxxxx=\')' 匹配的 HTTP 资源。未找到此请求的路由数据。\'}

    如何更新 HierarchyPosition 实体?

  • 并非完全内置,但您可以使用 Ritchie Sacramento 对该 english 包的建议。首先,您用单词制作一个长字符串,其中包含单词的序数值。然后,您可以在这些有序的序数值列表中找到单词的位置:

    library(english)
    ordinal <- c("First", "Third", "Second")
    o <- ordinal(1:1000)
    match(tolower(ordinal), o)
    #> [1] 1 3 2
    

    第二种方法,正如 Ritchie 所建议的,不太复杂。我使用了略有不同的方法,但最终效果是一样的。

    ordinal2 <- c("1st", "4th", "2nd")
    as.numeric(stringr::str_extract(ordinal2, "\\d+"))
    #> [1] 1 4 2
    

    Created on 2023-01-11 by the reprex 包 (v2.0.1)

    你甚至可以将它们放在一个函数中:

    ordinal_to_numeric <- function(x, max_ord=1000){
      if(any(grepl("\\d", x))){
        as.numeric(stringr::str_extract(x, "\\d+"))
      }else{
        require(english, quietly = TRUE)
        o <- ordinal(seq(1,max_ord, by=1))
        match(tolower(x), o)
      }
    }
    ordinal <- c("First", "Third", "Second")
    ordinal_to_numeric(ordinal)
    #> [1] 1 3 2
    
    ordinal2 <- c("1st", "4th", "2nd")
    ordinal_to_numeric(ordinal2)
    #> [1] 1 4 2
    

    Created on 2023-01-11 by the reprex 包 (v2.0.1)

  • 我迟到了,@DaveArmstrong 的解决方案肯定更简单,但这里有一个更通用的解决方案,首先将序数转换为基数,然后将它们传递 nombre::uncardinal() 给转换为数字。 str_replace_all() 序数 -> 基数转换的向量基于代码 nombre::ordinal() .

    library(stringr)
    library(nombre)
    
    ordinal_to_numeric <- function(x) {
      w_word_stem <- function(x) {
        x |>
        str_to_lower() |>
        str_remove("st$|nd$|rd$|th$") |>
        str_replace_all(c(
          "fir$" = "one",
          "seco$" = "two",
          "thi$" = "three",
          "f$" = "ve",
          "eigh$" = "eight",
          "nin$" = "nine",
          "ie$" = "y"
        )) |>
        uncardinal()
      }
      w_num_stem <- function(x) {
        x |>
          str_extract("^-?\\d+") |>
          as.numeric()
      }
      out <- suppressWarnings(ifelse(
        str_starts(x, "-?\\d"), 
        w_num_stem(x),
        w_word_stem(x)
      ))
      if (any(is.na(out) & !is.na(x))) {
        warning("Conversion failed for some inputs")
      }
      out
    }
    
    ordinal <- c("First", "Third", "Second", "Five Hundred Thirty Eighth", "Negative Twenty-Third")
    ordinal_to_numeric(ordinal)
    # 1   3   2 538 -23
    
    ordinal2 <- c("1st", "4th", "2nd", "538th", "-23rd")
    ordinal_to_numeric(ordinal2)
    # 1   4   2 538 -23
    
  • 第二个向量的解决方案很简单。如果您愿意为第一个向量使用 非 CRAN 包, 则可以执行以下操作:

    # devtools::install_github("benmarwick/words2number")
    library(words2number)
    
    text2num <- function(x) {
      isOrd <- grepl("\\d+", x)
      x[isOrd] <- as.numeric(gsub("\\D+", "", x[isOrd]))
      x[!isOrd] <- to_number(x[!isOrd])
      as.numeric(x)
    }
    

    一个方便的好处是,这可以处理具有两种情况组合的向量:

    text2num(c(ordinal, ordinal2))
    # [1] 1 3 2 1 4 2
    

    提到的一些缺点:

    1. 此软件包为实验性的
    2. 它不处理小数(例如六点一)
    3. 软件包作者指定的上限是数百万
    4. magrittr 有不必要的依赖 %>% 。(由于现在有基管道,所以没有必要)
返回
作者最近主题: