【问题标题】:R group by substringR按子串分组
【发布时间】:2019-02-19 21:30:33
【问题描述】:

样本数据

data = data.frame(id = c(1, 2, 3, 4, 5),
              name = c("blue", "green", "red", "read", "HUE"),
              WANT = c("ue", "re", "re", "re", "ue"))

解释一下。如果“name”包含“ue”,则 WANT =“ue”,如果“name”包含“re”,则 WANT =“re”。大小写无关紧要。

这是我的尝试:

    df$attempt <- NA
df$attempt[substr(df$name) == "ue"] <- "ue"
df$attempt[substr(df$name) == "re"] <- "re"

【问题讨论】:

  • 没有“ue”或“re”的情况怎么办?那么“ue”和“re”都存在的情况呢?
  • 如果不包含“ue”或“re”,则 group = NA。如果它同时具有[它不应该],那么哪个先发生。谢谢

标签: r string substring


【解决方案1】:

使用stringrtidyverse 的一部分)的解决方案。

library(tidyverse)

data2 <- data %>%
  mutate(attempt = str_extract(name, pattern = regex("ue|re", ignore_case = TRUE)),
         attempt = str_to_lower(attempt))
data2
#   id  name WANT attempt
# 1  1  blue   ue      ue
# 2  2 green   re      re
# 3  3   red   re      re
# 4  4  read   re      re
# 5  5   HUE   ue      ue

数据

data = data.frame(id = c(1, 2, 3, 4, 5),
              name = c("blue", "green", "red", "read", "HUE"),
              WANT = c("ue", "re", "re", "re", "ue"))

【讨论】:

    【解决方案2】:

    这里有几个版本

    data = data.frame(id = c(1, 2, 3, 4, 5),
                      name = c("blue", "green", "red", "read", "HUE"))
    
    
    #base r version
    data$want <- ifelse(grepl("ue", data$name, ignore.case = T), "ue",
                        ifelse(grepl("re", data$name, ignore.case = T), "re",
                               NA))
    #tidyverse version
    library(dplyr)
    
    data <- data %>%
      mutate(want = ifelse(grepl("ue", name, ignore.case = T), "ue",
                           ifelse(grepl("re", name, ignore.case = T), "re",
                                  NA)))
    

    【讨论】:

    • 非常感谢。最后,假设我有 10 多个类别。我尝试了“ifelse”,但这似乎不起作用。有没有另一种方式来呈现 10 多个 ifelse 语句?
    • @bvowe 您可以使用dplyr 中的case_when 而不是ifelse,但如果有10 个以上的字符串,我的解决方案中的str_extract 可能更有意义。
    【解决方案3】:

    尝试使用ifelsemutategrepl("ue",name,ignore.case = T) 检查 ue 或 UE 是否存在。同样的逻辑适用于[re]

    library(dplyr)
    
        data = data%>%
      mutate(Attempt = ifelse(grepl("ue",name,ignore.case = T),"ue",
                              ifelse(grepl("re",name,ignore.case = T),"re",NA)))
    

    【讨论】:

    • 这使得所有的“尝试”变量都变成了“ue”
    • ignore.case = TRUE 用于grepl,而不是同时包含大小写模式。
    【解决方案4】:

    使用purrrdplyr

    library(dplyr)
    library(purrr)
    
    data %>%
      mutate(group = map2_chr(WANT, name, ~ .x[grepl(.x, .y, ignore.case = TRUE)]))
    

    输出:

      id  name WANT group
    1  1  blue   ue    ue
    2  2 green   re    re
    3  3   red   re    re
    4  4  read   re    re
    5  5   HUE   hu    hu
    

    数据:

    data = data.frame(id = c(1, 2, 3, 4, 5),
                       name = c("blue", "green", "red", "read", "HUE"),
                       WANT = c("ue", "re", "re", "re", "hu"),
                       stringsAsFactors = FALSE)
    

    【讨论】:

    • WANT 列可能不存在。
    猜你喜欢
    • 2022-09-22
    • 1970-01-01
    • 2012-07-15
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    相关资源
    最近更新 更多