Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中使用模式匹配从现有列创建新列_R_Regex_Pattern Matching - Fatal编程技术网

在R中使用模式匹配从现有列创建新列

在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

我正在尝试使用模式匹配在另一列的基础上添加一个新列。 我读过,但没有得到想要的输出

我想基于GreatGroup列创建一个新列(子订单)。 我尝试了以下方法:

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)