【问题标题】:removing numbers and characters from column names r从列名 r 中删除数字和字符
【发布时间】:2021-10-06 20:14:33
【问题描述】:

我正在尝试从 R 中的数据框中的列名中删除特定的数字和字符,但我只能删除数字,尝试了不同的方式但仍将字符保留在末尾。

每一列用字母表示,然后是括号中的数字;例如日月光 (232)

数据帧

Subject ASE (232) ASD (121) AFD (313)
   1        1.1.     1.2     1.3

所需的数据帧

Subject ASE ASD AFD
   1    1.1 1.2 1.3

代码

colnames(data)<-gsub("[A-Z] ([0-9]+)","",colnames(data))

【问题讨论】:

    标签: r gsub substitution


    【解决方案1】:

    我们可能会更改代码以匹配一个或多个空格 (\\s+) 后跟左括号 (\\(、一个或多个数字 (\\d+) 和其他字符 (.*) 并替换为空白("")

    colnames(data) <- sub("\\s+\\(\\d+.*", "", colnames(data))
    colnames(data)
    [1] "Subject" "ASE"     "ASD"     "AFD"    
    

    或者另一个选项是trimws from base R

    trimws(colnames(data), whitespace = "\\s+\\(.*")
    [1] "Subject" "ASE"     "ASD"     "AFD"    
    

    在 OP 的代码中,它匹配一个大写字母后跟空格,( 是一个元字符,它不会被转义。 ,因此在正则表达式模式下,它会捕获数字(([0-9]+))。但是,这不匹配列名中的模式,因为在一个空格之后,有一个(,它不匹配,因此它返回相同的字符串

    gsub("[A-Z] ([0-9]+)","",colnames(data))
    [1] "Subject"   "ASE (232)" "ASD (121)" "AFD (313)"
    

    数据

    data <- structure(list(Subject = 1L, `ASE (232)` = "1.1.", `ASD (121)` = 1.2, 
        `AFD (313)` = 1.3), class = "data.frame", row.names = c(NA, 
    -1L))
    

    【讨论】:

    • 也感谢您的解释,没想到OP中这种正则表达式的感觉已经足够了。
    【解决方案2】:

    你可以这样做:

    sub("(\\w+).*", "\\1", colnames(data))
    

    这使用反向引用 \\1 来“记住”任何一系列字母数字字符 \\w+ 并用记住的位替换 sub 的替换参数中的整个字符串。

    【讨论】:

      【解决方案3】:

      我们可以使用来自stringr 包的wordrename_with

      library(stringr)
      library(dplyr)
      data %>% 
        rename_with(~word(., 1))
      
        Subject  ASE ASD AFD
      1       1 1.1. 1.2 1.3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 2022-01-22
        相关资源
        最近更新 更多