【问题标题】:R: Extract first two digits from nested list elementsR:从嵌套列表元素中提取前两位数字
【发布时间】:2018-03-21 05:50:26
【问题描述】:

对于以下向量,我只保留每个整数的前两位:

a <- c('1234 2345 345 234', '323 55432 443', '43 23345 321')

我尝试通过使用strsplit 将向量转换为嵌套列表,然后将substr 应用于列表来做到这一点:

a <- strsplit(a, ' ')
a <- substr(a, start = 1, stop = 2)

但是,这似乎只是提取了连接命令的开头:

a
[1] "c(" "c(" "c("

理想情况下,我可以将向量强制转换为以下形式:

[[1]]
[1] "12" "23" "34" "23"

[[2]]
[1] "32" "55" "44"

[[3]]
[1] "43" "23" "32"

【问题讨论】:

    标签: r substring strsplit


    【解决方案1】:

    怎么样

    lapply(strsplit(a, " "), substr, 1, 2)
    

    这对strsplit 的结果显式地执行lapply。这是因为substr() 试图首先将您的列表强制转换为字符向量(它不希望将列表作为第一个参数)。如果你这样做,你可以看到它在看什么

    as.character(strsplit(a, ' '))
    # [1] "c(\"1234\", \"2345\", \"345\", \"234\")" "c(\"323\", \"55432\", \"443\")"         
    # [3] "c(\"43\", \"23345\", \"321\")"  
    

    【讨论】:

    • 效果非常好 - 谢谢!另外,感谢您花时间解释我是如何误解substr()
    【解决方案2】:

    我们还可以从单词边界中提取前两位数字

    library(stringr)
    str_extract_all(a, "\\b\\d{2}")
    #[[1]]
    #[1] "12" "23" "34" "23"
    
    #[[2]]
    #[1] "32" "55" "44"
    
    #[[3]]
    #[1] "43" "23" "32"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2022-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      相关资源
      最近更新 更多