r - 根据向量中的多个模式中的任意一个将值分配给新列

标签 r

我有以下数据集,名为 df :

structure(list(col1 = c("a b", "d e", "g f", "h j", "j k", "y z", 
"e f", "b c", "f g", "c d", "y z", "t u")), class = "data.frame", row.names = c(NA, 
-12L))

对于这个数据集,我有两个匹配的向量:一个名为 matching1 <- c("a b", "b c", "c d") 的向量和一个名为 matching2 <- c("c d","e f","f g") 的向量。在我的df ,我想创建一个新列并为匹配项分配一个值。对于向量matching1 ,我想为向量 matching2 分配一个值 1我想分配一个值 2,并为每个不匹配的字符串分配一个值 3。理想情况下,向量 matching2 的值分配不会改变之前的值分配,因为向量 matching1matching2两者都具有字符串 "d e" 。我知道我可以使用:

matches1 <- paste0(na.omit(matching1), "", collapse = "|")

使用 or 创建折叠向量我尝试将它与 case_when 结合起来。然而case_when只允许单一模式,并且我的原始数据集中的潜在匹配列表非常长,因此我想避免明确地拼写出每个条件。

输出应如下所示:

structure(list(col1 = c("a b", "d e", "g f", "h j", "j k", "y z", 
"e f", "b c", "f g", "c d", "y z", "t u"), col2 = c("1", "2", 
"3", "3", "3", "3", "2", "1", "2", "1", "3", "3")), class = "data.frame", row.names = c(NA, 
-12L))

最佳答案

我认为这样做可以:

编辑:执行match2,以捕获“c d”同时存在的情况,并且首选match1

df$ans<-ifelse(df$col1 %in% matching2, 2, 3)
df$ans<-ifelse(df$col1 %in% matching1, 1, df$ans)

或者用langtang的评论预编辑版本:

df$ans<-ifelse(df$col1 %in% matching1, 1, 3)
df$ans<-ifelse(df$col1 %in% setdiff(matching2, matching1), 2, df$ans)

关于r - 根据向量中的多个模式中的任意一个将值分配给新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74174768/

相关文章:

R:如果日期差异小于 7,则按组添加前一行的值

r - Knitr 在 R 代码中转义 latex 特殊字符(例如,〜,$)

r - 如何在 Shiny 中从 server.R 解析为 HTML 标签

html - Shiny 应用程序的导航栏干扰 rmarkdown 网页的导航栏

r - 向 R 气泡图添加基于颜色的区分

r - R中的性能:在矩阵中对行的元素进行排序的最快方法是什么?

r - 使用shinyalert确认数据更新

r - 如何将数字列转换为 R 中的因子

r - do.call(rbind, ...) 有更高阶的替代品吗?

string - R - paste() 在将数据帧传递给它时调用 as.numeric() 吗?