【问题标题】:Extract variable names using stringr in R在 R 中使用 stringr 提取变量名
【发布时间】:2018-06-04 17:44:45
【问题描述】:

我正在尝试从以下向量中提取一些变量名称和数字并将它们存储到两个新变量中:

unique_strings <- c("PM_1_PMS5003_S_Avg", "PM_2_5_PMS5003_S_Avg", "PM_10_PMS5003_S_Avg", 
  "PM_1_PMS5003_A_Avg", "PM_2_5_PMS5003_A_Avg", "PM_10_PMS5003_A_Avg", 
  "PNC_0_3_PMS5003_Avg", "PNC_0_5_PMS5003_Avg", "PNC_1_0_PMS5003_Avg", 
  "PNC_2_5_PMS5003_Avg", "PNC_5_0_PMS5003_Avg", "PNC_10_0_PMS5003_Avg", 
  "PM_1_PMS7003_S_Avg", "PM_2_5_PMS7003_S_Avg", "PM_10_PMS7003_S_Avg", 
  "PM_1_PMS7003_A_Avg", "PM_2_5_PMS7003_A_Avg", "PM_10_PMS7003_A_Avg", 
  "PNC_0_3_PMS7003_Avg", "PNC_0_5_PMS7003_Avg", "PNC_1_0_PMS7003_Avg", 
  "PNC_2_5_PMS7003_Avg", "PNC_5_0_PMS7003_Avg", "PNC_10_0_PMS7003_Avg"
)

我想为第一个变量提取PMS 之前的每个字符。这包括带有PMPNC 的字符串,以及下划线和数字。我想将这些结果存储到一个名为pollutant 的变量中。

期望的输出:

unique(pollutant)
[1] "PM_1" "PM_2_5" "PM_10" "PNC_0_3" "PNC_0_5" "PNC_1_0" "PNC_2_5" "PNC_5_0" "PNC_10"

我想为第二个变量提取 PMS 之后的所有内容。

为此,我首先尝试从每个字符串中仅提取型号(以003 结尾的四位数字),但是,在提取中也包含A_AvgS_Avg 会很有用.

这是我的第一次尝试:

model_id <- str_extract(unique_strings, "[0-9]{4,}")

unique(model_id)
[1] "5003" "7003"

我之前没有使用过正则表达式,并且在浏览现有文档/堆栈帖子时遇到了困难。感谢您的意见!

【问题讨论】:

    标签: r regex split stringr stringi


    【解决方案1】:

    我们可以使用str_split根据"PMS"分割字符串。之后,使用str_replace 删除第一列中的最后一个"_"。输出为m。第一个变量在第一列,第二个变量在第二列。

    library(stringr)
    m <- str_split(unique_strings, pattern = "PMS", simplify = TRUE)
    m[, 1] <- str_replace(m[, 1], "_$", "")
    m
    #       [,1]       [,2]        
    #  [1,] "PM_1"     "5003_S_Avg"
    #  [2,] "PM_2_5"   "5003_S_Avg"
    #  [3,] "PM_10"    "5003_S_Avg"
    #  [4,] "PM_1"     "5003_A_Avg"
    #  [5,] "PM_2_5"   "5003_A_Avg"
    #  [6,] "PM_10"    "5003_A_Avg"
    #  [7,] "PNC_0_3"  "5003_Avg"  
    #  [8,] "PNC_0_5"  "5003_Avg"  
    #  [9,] "PNC_1_0"  "5003_Avg"  
    # [10,] "PNC_2_5"  "5003_Avg"  
    # [11,] "PNC_5_0"  "5003_Avg"  
    # [12,] "PNC_10_0" "5003_Avg"  
    # [13,] "PM_1"     "7003_S_Avg"
    # [14,] "PM_2_5"   "7003_S_Avg"
    # [15,] "PM_10"    "7003_S_Avg"
    # [16,] "PM_1"     "7003_A_Avg"
    # [17,] "PM_2_5"   "7003_A_Avg"
    # [18,] "PM_10"    "7003_A_Avg"
    # [19,] "PNC_0_3"  "7003_Avg"  
    # [20,] "PNC_0_5"  "7003_Avg"  
    # [21,] "PNC_1_0"  "7003_Avg"  
    # [22,] "PNC_2_5"  "7003_Avg"  
    # [23,] "PNC_5_0"  "7003_Avg"  
    # [24,] "PNC_10_0" "7003_Avg"
    

    【讨论】:

    • 感谢您的帮助。这成功了,我现在对正则表达式感觉更舒服了!
    【解决方案2】:

    我们可以使用str_extract 从字符串 (^(PM|PNC)) 的开头 (^) 匹配“PM”或“PNC”,然后是 _ 和一个或多个数字 (\\d+ ) 后跟有另一组 _ 和数字的案例(为此我们指定零个或多个 ((_\\d)*)

    library(stringr)
    out <- str_extract(unique_strings, "^(PM|PNC)_\\d+(_\\d)*")
    

    这将为那些没有匹配的元素提供NA。如果我们需要删除那些

    na.omit(out)
    

    对于第二种情况,不清楚所需的输出。如果我们需要提取PMS 之后的所有内容,我们可以在 ((?&lt;=PMS)) 后面使用正则表达式并匹配 (.*) 后面的所有字符

    str_extract(unique_strings, "(?<=PMS).*")
    

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 1970-01-01
      • 2018-07-04
      • 1970-01-01
      • 2019-02-28
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多