- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据框:
df <- data.frame(name=c("john", "david", "callum", "joanna", "allison", "slocum", "lisa"), id=1:7)
df
name id
1 john 1
2 david 2
3 callum 3
4 joanna 4
5 allison 5
6 slocum 6
7 lisa 7
我有一个包含正则表达式的向量,我希望在 df$name 变量中找到它:
vec <- c("lis", "^jo", "um$")
我想要得到的输出如下:
name id group
1 john 1 2
2 david 2 NA
3 callum 3 3
4 joanna 4 2
5 allison 5 1
6 slocum 6 3
7 lisa 7 1
我可以通过以下方式做到这一点:
df$group <- ifelse(grepl("lis", df$name), 1,
ifelse(grepl("^jo", df$name), 2,
ifelse(grepl("um$", df$name), 3,
NA)
但是,我想直接从“vec”执行此操作。我正在一个 Shiny 的应用程序中 react 性地将不同的值生成到 vec 中。我可以根据 vec 中的索引分配组吗?
此外,如果发生以下情况,该组应该是第一个出现的。例如对于“all”和“um$”,“Callum”为 TRUE,但此处应该得到组 1。
vec <- c("all", "^jo", "um$")
最佳答案
这里有几个选项:
df$group <- apply(Vectorize(grepl, "pattern")(vec, df$name),
1,
function(ii) which(ii)[1])
# name id group
#1 john 1 2
#2 david 2 NA
#3 callum 3 3
#4 joanna 4 2
#5 allison 5 1
#6 slocum 6 3
#7 lisa 7 1
<小时/>
使用命名向量并对其进行合并:
names(vec) <- seq_along(vec)
df <- merge(df, stack(Vectorize(grep, "pattern", SIMPLIFY=FALSE)(vec, df$name)),
by.x="id", by.y="values", all.x = TRUE)
df[!duplicated(df$id),] # to keep only the first match
# id name ind
#1 1 john 2
#2 2 david <NA>
#3 3 callum 3
#4 4 joanna 2
#5 5 allison 1
#6 6 slocum 3
#7 7 lisa 1
<小时/>
for 循环:
df$group <- NA
for ( i in rev(seq_along(vec))) {
TFvec <- grepl(vec[i], df$name)
df$group[TFvec] <- i
}
df
# name id group
#1 john 1 2
#2 david 2 NA
#3 callum 3 3
#4 joanna 4 2
#5 allison 5 1
#6 slocum 6 3
#7 lisa 7 1
<小时/>
或者您可以将 outer
与 stringi
中的 stri_match_first_regex
一起使用
library(stringi)
match.mat <- outer(df$name, vec, stri_match_first_regex)
df$group <- apply(match.mat, 1, function(ii) which(!is.na(ii))[1])
# [1] for first match in `vec`
# name id group
#1 john 1 2
#2 david 2 NA
#3 callum 3 3
#4 joanna 4 2
#5 allison 5 1
#6 slocum 6 3
#7 lisa 7 1
关于regex - 使用具有多个输入的 grepl 分配组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34702882/
我希望这段代码返回一个包含 26 个 TRUE 的向量,但它返回的都是 FALSE。 grepl(".*", LETTERS, fixed=T) 从文档中,“grepl 返回一个逻辑向量(匹配或不匹配
我想在我的数据框中创建一个新列,该列是 TRUE 还是 FALSE,具体取决于术语是否出现在两个指定的列中。 这是一些示例数据: AB M AB
我有一个格式如下所示的数据框: String Keyword 1 Apples bananas mangoes
我想在两个向量上应用 grepl 以查看第一个向量的元素是否在第二个向量的相应元素中可用。例如 grepl(c("bc","23","a2"),c("abcd","1234","zzzz")) 由于
我正在做一些看似非常简单的事情。我想使用 grepl() 命令——或类似的命令——在几个不同的短语上对 R 中的数据帧进行子集化,而不构建循环。 例如,我想提取名为 Bob 或 Mary 的任何人的所
我在将 grepl 与正则表达式结合使用时遇到困难。 这是一个小例子: 我有一个字符向量: text D_.+ | \\>F_.+", text) grepl("\\D_.+ | \\F_.+", t
看来,虽然grep具有反转参数,但 grepl 没有。 我想为使用2个过滤器的子集 data$ID[grepl("xyx", data$ID) & data$age>60] 如何为年龄大于60且ID为
我希望根据条件连接两个数据帧,在本例中,一个字符串在另一个字符串中。假设我有两个数据框, df1 % # Format resulting dataset as you requested.
我希望根据条件连接两个数据帧,在本例中,一个字符串在另一个字符串中。假设我有两个数据框, df1 % # Format resulting dataset as you requested.
我在 R 中使用 grepl() 将模式与字符串进行匹配。 我需要将多个字符串与一个公共(public)字符串匹配,如果它们全部匹配,则返回 TRUE。 例如: a <- 'DEARBORN TRUC
我需要使用另一个数据框按列过滤数据框,但由于匹配不准确,我想使用 grepl 是一种方法。 下面的代码可以作为例子: A % filter(.,grepl("RT",X)) # the result
我有一个数据框 (df),其中包含州和城市的 2 列数据。但是,有时 2 列中的数据会被调换或输入错误。数据框看起来像这样: location state Bangkok
目前我正在使用带有 grepl 的嵌套 ifelse 函数来检查与数据框中的字符串向量是否匹配,例如: # vector of possible words to match x my_text$n
我使用 grepl 检查字符串是否包含一组模式中的任何模式(我使用“|”来分隔模式)。反向搜索没有帮助。如何识别匹配的模式集? 附加信息:这可以通过编写一个循环来解决,但它非常耗时,因为我的集合有 >
我有一个包含列名和行名的数据,其中包含一个从 1 到 100 的数字的字符串。 我正在使用 grepl 来选择具有特定数字的名称(同时忽略字符串)。说我有: a <- matrix(c(1:16),
我有一个数据(大数据 125000 行,~20 MB),其中一些具有特定字符串的行需要删除,并且在读取过程中需要选择一些列。 首先,我发现grepl功能无法正常工作,因为 fread将数据作为此 qu
这个问题在这里已经有了答案: R regex to find two words same string, order and distance may vary (2 个回答) 去年关闭。 grep
我的数据框如下所示。我需要根据“geneID”列的名称一一提取特定行的数据。我使用 grepl 函数。 #Data frame:geneDf geneID=c("EGFR","Her2","PTEN
我有一个数据集(名为桌面),其中包含来自网络跟踪器的按时间顺序排列的信息,其中包含一列中不同用户访问的 URL 和另一列中的用户 ID。以搜索引擎分析为目标,我试图过滤所有包含用户向谷歌提交搜索查询的
让我们考虑一个包含两列word 和stem 的df。我想创建一个新列来检查 stem 中的值是否包含在 word 中,以及它前面或后面是否有更多字符。最终结果应该是这样的: WORD STEM
我是一名优秀的程序员,十分优秀!