在R中使用模式匹配从现有列创建新列
我正在尝试使用模式匹配在另一列的基础上添加一个新列。 我读过,但没有得到想要的输出 我想基于GreatGroup列创建一个新列(子订单)。 我尝试了以下方法:在R中使用模式匹配从现有列创建新列,r,regex,pattern-matching,R,Regex,Pattern Matching,我正在尝试使用模式匹配在另一列的基础上添加一个新列。 我读过,但没有得到想要的输出 我想基于GreatGroup列创建一个新列(子订单)。 我尝试了以下方法: SubOrder <- rep(NA_character_, length(myData)) SubOrder[grepl("udults", myData, ignore.case = TRUE)] <- "Udults" SubOrder[grepl("aquults", myData, ignore.case = T
SubOrder <- rep(NA_character_, length(myData))
SubOrder[grepl("udults", myData, ignore.case = TRUE)] <- "Udults"
SubOrder[grepl("aquults", myData, ignore.case = TRUE)] <- "Aquults"
SubOrder[grepl("aqualfs", myData, ignore.case = TRUE)] <- "aqualfs"
SubOrder[grepl("humods", myData, ignore.case = TRUE)] <- "humods"
SubOrder[grepl("udalfs", myData, ignore.case = TRUE)] <- "udalfs"
SubOrder[grepl("orthods", myData, ignore.case = TRUE)] <- "orthods"
SubOrder[grepl("udalfs", myData, ignore.case = TRUE)] <- "udalfs"
SubOrder[grepl("psamments", myData, ignore.case = TRUE)] <- "psamments"
SubOrder[grepl("udepts", myData, ignore.case = TRUE)] <- "udepts"
SubOrder[grepl("fluvents", myData, ignore.case = TRUE)] <- "fluvents"
SubOrder[grepl("aquods", myData, ignore.case = TRUE)] <- "aquods"
子订单尝试以下操作:
myData$SubOrder[grepl("udults", myData$TaxClName, ignore.case = TRUE) | grepl("udults", myData$GreatGroup, ignore.case = TRUE)] <- "Udults"
myData$SubOrder[grepl(“udults”,myData$TaxClName,ignore.case=TRUE)|grepl(“udults,myData$GreatGroup,ignore.case=TRUE)]试试这个:
myData$SubOrder[grepl("udults", myData$TaxClName, ignore.case = TRUE) | grepl("udults", myData$GreatGroup, ignore.case = TRUE)] <- "Udults"
myData$SubOrder[grepl(“udults”,myData$TaxClName,ignore.case=TRUE)| grepl(“udults,myData$GreatGroup,ignore.case=TRUE)]我正在使用dplyr,但您可能需要创建一个巨大的嵌套ifelse语句
library(dplyr)
myData %>%
mutate(SubOrder = ifelse(grepl('udults', GreatGroup, ignore.case = T), 'Udults',
ifelse(grepl('aquults', GreatGroup, ignore.case = T, 'Aquults',
### All of the other ifelse statements
ifelse(grepl('fluvents', GreatGroup, ignore.case = T), 'fluvents', 'aquods')
))))
我使用的是dplyr,但您可能需要创建一个巨大的嵌套ifelse语句
library(dplyr)
myData %>%
mutate(SubOrder = ifelse(grepl('udults', GreatGroup, ignore.case = T), 'Udults',
ifelse(grepl('aquults', GreatGroup, ignore.case = T, 'Aquults',
### All of the other ifelse statements
ifelse(grepl('fluvents', GreatGroup, ignore.case = T), 'fluvents', 'aquods')
))))
您可以使用一个连续替换每个模式的函数来实现这一点,这样可以避免反复重复代码。注意,使用这种方法,如果给定字符串匹配多个模式,则替换序列中的第一个模式将被使用
# multi-grepl function adapted from http://stackoverflow.com/a/15254254/496488
mgrepl <- function(pattern, replacement, x, ...) {
if (length(pattern) != length(replacement)) {
stop("pattern and replacement do not have the same length.")
}
result <- x
for (i in 1:length(pattern)) {
result[grepl(pattern[i], result, ...)] = replacement[i]
}
result
}
# Patterns and replacements
pat = c("udults","aquults","humods","fluvents")
repl = c("Udults","Aquults","humods","fluvents")
SubOrder = mgrepl(pat, repl, myData$GreatGroup)
SubOrder
[1] "Udults" "Udults" "Udults" "Udults" "Udults" "Udults"
# Or, if you want to add this as a new column to the data:
myData$SubOrder = mgrepl(pat, repl, myData$GreatGroup)
您可以使用一个连续替换每个模式的函数来实现这一点,这样可以避免反复重复代码。注意,使用这种方法,如果给定字符串匹配多个模式,则替换序列中的第一个模式将被使用
# multi-grepl function adapted from http://stackoverflow.com/a/15254254/496488
mgrepl <- function(pattern, replacement, x, ...) {
if (length(pattern) != length(replacement)) {
stop("pattern and replacement do not have the same length.")
}
result <- x
for (i in 1:length(pattern)) {
result[grepl(pattern[i], result, ...)] = replacement[i]
}
result
}
# Patterns and replacements
pat = c("udults","aquults","humods","fluvents")
repl = c("Udults","Aquults","humods","fluvents")
SubOrder = mgrepl(pat, repl, myData$GreatGroup)
SubOrder
[1] "Udults" "Udults" "Udults" "Udults" "Udults" "Udults"
# Or, if you want to add this as a new column to the data:
myData$SubOrder = mgrepl(pat, repl, myData$GreatGroup)
有几个选项,其中一些我在上面的评论中发表了
注意:所有选项都假定匹配模式的字符串的替换就是模式。如果您需要其他内容,它们都可以轻松编辑,以包含单独的替换值
选项1:用于
+grepl
使用与原始代码相同的代码,但循环以避免重复代码:
# make a list of patterns
pat <- c('udults', 'aquults', 'aqualfs', 'humods', 'udalfs', 'orthods', 'psamments', 'udepts', 'fluvents', 'aquods')
SubOrder <- rep(NA_character_, length(myData))
for(x in 1:length(pat)){
SubOrder[grepl(pat[x], myData$GreatGroup, ignore.case = TRUE)] <- pat[x]
}
请注意,与pat
中的一个字符串不匹配的值将具有GreatGroup
中的值,而不是NA
。如果您希望它们是NA
,请使用
myData$SubOrder[!(myData$SubOrder %in% pat)] <- NA
看来
> l
$`.*udults.*`
[1] "udults"
$`.*aquults.*`
[1] "aquults"
$`.*aqualfs.*`
[1] "aqualfs"
......
然后使用str\u replace\u all
一次完成所有操作:
myData$SubOrder <- str_replace_all(myData$GreatGroup, l)
myData$SubOrder有几个选项,其中一些是我在上面的评论中发布的
注意:所有选项都假定匹配模式的字符串的替换就是模式。如果您需要其他内容,它们都可以轻松编辑,以包含单独的替换值
选项1:用于
+grepl
使用与原始代码相同的代码,但循环以避免重复代码:
# make a list of patterns
pat <- c('udults', 'aquults', 'aqualfs', 'humods', 'udalfs', 'orthods', 'psamments', 'udepts', 'fluvents', 'aquods')
SubOrder <- rep(NA_character_, length(myData))
for(x in 1:length(pat)){
SubOrder[grepl(pat[x], myData$GreatGroup, ignore.case = TRUE)] <- pat[x]
}
请注意,与pat
中的一个字符串不匹配的值将具有GreatGroup
中的值,而不是NA
。如果您希望它们是NA
,请使用
myData$SubOrder[!(myData$SubOrder %in% pat)] <- NA
看来
> l
$`.*udults.*`
[1] "udults"
$`.*aquults.*`
[1] "aquults"
$`.*aqualfs.*`
[1] "aqualfs"
......
然后使用str\u replace\u all
一次完成所有操作:
myData$SubOrder <- str_replace_all(myData$GreatGroup, l)
myData$SubOrder使您的代码更加干练,为您的模式(以及替换,如果它们不同的话)创建一个向量,并使用sapply
调用grepl
或gsub
或您喜欢的任何东西。我尝试了类似的方法:使用for
循环、pat或更直接地调用,myData$SubOrder使您的代码更加干练,为您的模式(以及替换,如果它们不同的话)创建一个向量,并使用sapply
调用grepl
或gsub
或您喜欢的任何东西。我尝试了类似的方法:使用for
循环、pat或更直接地调用,myData$SubOrder感谢您指出我代码中的错误。此外,这段代码似乎还将模式作为替换返回。我需要能够在多个单词中搜索“udults”,如Hapludults、paludults,然后返回两者的udults。请参阅我答案的更新。据我所知,我的答案中的代码似乎做了正确的事情。谢谢你指出我代码中的错误。此外,这段代码似乎还将模式作为替换返回。我需要能够在多个单词中搜索“udults”,如Hapludults、paludults,然后返回两者的udults。请参阅我答案的更新。就我所知,我答案中的代码似乎在做正确的事情。选项3的+1。。。虽然现在它不适用于命名列表,但选项3只适用于命名向量names(pat)+1。。。虽然现在它不适用于命名列表,但只适用于命名向量名称(pat)