我有一个数据框,其中包含一串类似以下的字符串:
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方法。因为我们可以使用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")