我有以下数据集,名为 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
的值分配不会改变之前的值分配,因为向量 matching1
和matching2
两者都具有字符串 "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/