【问题标题】:How to subset row values by string label in a single column in R?如何在 R 的单列中通过字符串标签对行值进行子集化?
【发布时间】:2020-06-16 07:43:27
【问题描述】:

我有一个列,我想根据 R 中的第一个和最后一个“字符串”标签对其行值进行子集化。级别值如下:

[1] "60022 (Location; 9TH FLOOR; Snacks)"
[3] "60024 (Location; 9TH FLOOR; Lg Snacks)"
[5] "60027 (Location; 9TH FLOOR; Sml Snacks)"

我想把# 和最后一个用';'分隔的字符串拉出来。 R中是否有函数或语法可以做到这一点?所以删除“Location; 9TH FLOOR”并保留最后一个; "" 字符串。

我已经尝试过仅提取第一个值,但无法使用此代码保留“零食”:

#updated_df_2020$Machine <- sub("([A-Za-z]+).*", "\\1", updated_df_2020$Machine) 

每一行的最终结果应该是数字(60022,然后是小吃),如下所示:

[1] "60022 (Snacks)" 
[1] "60024 (Lg Snacks)" 
[1] "60027 (Sml Snacks)" 

【问题讨论】:

    标签: r string dplyr gsub


    【解决方案1】:

    如果我们需要删除子字符串,捕获字符串开头(^)的数字(\\d+),然后捕获;之后的非空格(\\S)和零个或多个空格 (\\s*) 和后面的其他字符 (.*) 直到最后的 ) ($) 作为第二个捕获组。在替换中,指定捕获组的反向引用(\\1\\2)并通过添加(进行修改

    updated_df_2020$Machine <- sub("^(\\d+)\\b.*;\\s*\\b(\\S.*\\))$", 
            "\\1 (\\2", updated_df_2020$Machine)
    updated_df_2020$Machine
    #[1] "60022 (Snacks)"     "60024 (Lg Snacks)"  "60027 (Sml Snacks)"
    

    如果字符串的开头不是数字并且仍想提取,请将 ((\\d+)) 替换为 (\\w+)

    数据

    updated_df_2020 <- data.frame(Machine = c("60022 (Location; 9TH FLOOR; Snacks)",
       "60024 (Location; 9TH FLOOR; Lg Snacks)", "60027 (Location; 9TH FLOOR; Sml Snacks)"),
       stringsAsFactors = FALSE)
    

    【讨论】:

    • 感谢您的快速响应 - 因为有唯一的数字和值(小吃、饮料、瓶装饮料等......)有没有办法将其标准化为只取第一个值和最后一个值()? @akrun
    • 感谢明确的答案!谢谢!是否可以使用 (; ; Bottled Bev) 中的最后两个单词而不仅仅是“Bev”?我会做 "\\2 (\\2" 而不是 \\1?@akrun?
    • 确定可以,请您更新您的帖子并遵守所有规则
    • 更新/抱歉。
    【解决方案2】:

    你可以这样做

    > a <- c("60022 (Location; 9TH FLOOR; Snacks)", "60024 (Location; 9TH FLOOR; Snacks)", "60027 (Location; 9TH FLOOR; Snacks)")
    > strs <- strsplit(a, split = " ")
    > sapply(strs, function(s) paste(s[1], paste0("(", s[length(s)])))
    #
    # "60022 (Snacks)" "60024 (Snacks)" "60027 (Snacks)"
    #
    

    这更丑,但我想更容易理解

    【讨论】:

      【解决方案3】:

      我们可以使用sub提取开头的数字和后面的冒号:

      sub("(\\d+).*;(.*)", "\\1 (\\2", x)
      #[1] "60022 ( Snacks)"     "60024 ( Lg Snacks)"  "60027 ( Sml Snacks)"
      

      x 是哪里

      x <- c("60022 (Location; 9TH FLOOR; Snacks)", 
             "60024 (Location; 9TH FLOOR; Lg Snacks)",
             "60027 (Location; 9TH FLOOR; Sml Snacks)")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-24
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 2021-12-16
        • 2016-12-01
        相关资源
        最近更新 更多