如何根据R中的字符串模式列表对列进行分组?

问题描述 投票:0回答:1

我有一个数据框,其中包含一串类似以下的字符串:

String_Column      Rating
Greenyy             1
BigGREENglow        2
BLUEBERRY           8
Shiny Emeralds      3
Sky Blue            3
Skyblue             6 
CERULEAN            2
Blueish Green       5
BLOO                3

我想为这些值创建分组,因此,如果它具有与绿色同义的词或包含绿色的任何变体,我希望将其分组为“绿色”。蓝色也一样。

所以我希望以上内容看起来像这样:

String_Column     Grouping      Rating
Greenyy           Green         1
BigGREENglow      Green         2 
BLUEBERRY         Blue          8
Shiny Emeralds    Green         3
Sky Blue          Blue          3
Skyblue           Blue          6
CERULEAN          Blue          2
Blueish Green     Green         5  
BLOO              Not Found     3

我创建了一个蓝色列表和一个绿色列表,每个单词都充满了相关的单词。

Blue_List <- c("Blue", "BLUE", "blue", "Cerulean" , "CERULEAN", "cerulean" , "Sapphire", "sapphire" , "SAPPHIRE")

Green_List <- c("Green", "GREEN", "green", "Chartreuse", "CHARTREUSE", "chartreuse", "Emerald", "emerald", "EMERALD")

然后,我根据其是否在此列表中将每个字符串分为蓝色或绿色。并将此列添加到数据框。如果该值未包含在列表中,则返回“未找到”

我已经可以使用,

    DF$Grouping<-ifelse(grepl("TRUE",sapply(DF$String_Column, grepl, Green_List,ignore.case=TRUE, simplify=FALSE)),  "Green" ,
    grepl("TRUE",sapply(DF$String_Column, grepl, Blue_List,ignore.case=TRUE, simplify=FALSE)),"Blue" ,"Not Found")

但是,我需要保留分组的顺序,但我不知道该怎么做。对于“ Blueish Green”的示例,我希望将其分类为Green,但是在读取else子句时,它将被放入Blue分组中。

我想我可以对ifelse进行重新排序,使其首先具有“ Blue”,但是实际数据集要比我共享的数据集复杂得多,我最终希望对每个数据集的子集执行每个“ else”, t先前的分组。

任何帮助将不胜感激!谢谢!

r list if-statement sapply grepl
1个回答
0
投票

这是基本的R方法。因为我们可以使用ignore.case=TRUE,所以我将减少列表,但这并不是严格要求的:如果大小写很重要,则删除该组件。我真正依赖的唯一东西是每个元素的第一个元素都是相关的(并且将从中收集名称)。

tmpstr <- Reduce(function(s, lst) gsub(paste0("(", paste(lst, collapse = "|"), ")"), lst[1], s, ignore.case = TRUE),
                 list(Blue_List, Green_List), init = dat$String_Column)
tmpcolors <- regmatches(tmpstr,
                        gregexpr(paste0("(", paste(Blue_List[1], Green_List[1], sep = "|"), ")"),
                                 tmpstr, ignore.case = TRUE))
tmpcolors <- replace(tmpcolors, sapply(tmpcolors, Negate(length)), NA_character_)
tmpcolors <- sapply(tmpcolors, tail, n = 1)
tmpcolors[ is.na(tmpcolors) ] <- "Not Found"
dat$Grouping <- tmpcolors
dat
#      String_Column Rating  Grouping
# 1 Greenyy               1     Green
# 2 BigGREENglow          2     Green
# 3 BLUEBERRY             8      Blue
# 4 Shiny Emeralds        3     Green
# 5 Sky Blue              3      Blue
# 6 Skyblue               6      Blue
# 7 CERULEAN              2      Blue
# 8 Blueish Green         5     Green
# 9 BLOO                  3 Not Found

数据:

从“蓝绿色”获得“绿色”的假设是它是最后引用的颜色。如果您的规则比“最后提到的”还要复杂,那么...也许这将无法正常工作。

dat <- read.table(header=TRUE, sep="|", text="
String_Column   |   Rating
Greenyy         |    1
BigGREENglow    |    2
BLUEBERRY       |    8
Shiny Emeralds  |    3
Sky Blue        |    3
Skyblue         |    6 
CERULEAN        |    2
Blueish Green   |    5
BLOO            |    3")

Blue_List <- c("Blue", "cerulean" , "sapphire")
Green_List <- c("Green", "chartreuse", "emerald")
© www.soinside.com 2019 - 2024. All rights reserved.