R:如何将向量中的值与相同向量中的所有值进行匹配

时间:2018-08-06 03:43:17

标签: r

我正在寻找与此相似的向量

x <-c(“ P1D3,P3A7”,0,0,“ P1D3,P3A7”,“ P1D3,P2A3,P4D2”,0,“ P1D3,P3A7,P2G60”,“ P1D3,P3A7”)

我目前使用grepl

xPres <- grepl("P",x, ignore.case = FALSE)

目前如果我这样做

View(xPres)

我会看到这样的向量

(TRUE,FALSE,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE)

但是,我不仅要查找其中包含非0值的任何东西,还希望能够检查向量中的值或向量中值的一部分是否与某些值匹配同一向量中的其他值或值的一部分。

理想的结果会产生这样的结果

(TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,TRUE)

第5个值将发生变化,因为它没有任何匹配的部分,而其他所有内容中有一部分与同一向量中的其他值匹配,包括第7个值,因为它的一部分与某些向量匹配其他价值。

唯一的问题是每个值都有“ P1D3”,因为它存在于所有样本中。有办法解决这个问题吗?

编辑:如果我使用

创建了一个新矢量

x <-c(“ P1D3,P3A7”,0,0,“ P1D3,P3A7”,“ P1D3,P2A3,P4D2”,0,“ P1D3,P3A7,P2G60”,“ P1D3,P3A7”,“ P1D3 ,P2A3,P4D2“)

代码应产生

(TRUE,FALSE,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,TRUE)

查找多个常见子字符串似乎是最简单的方法,但是我不知道要下载的软件包或使用什么软件包。

1 个答案:

答案 0 :(得分:0)

使用原始的x,这似乎可以提供您想要的答案:

x <- c("P1D3,P3A7", 0, 0, "P1D3,P3A7", "P1D3, P2A3, P4D2", 0, "P1D3, P3A7, P2G60", "P1D3,P3A7")

然后解决:

spl <- lapply(strsplit(x, ",\\s*"), setdiff, y=c("P1D3","0"))
mapply(function(v,s) any(v %in% unlist(spl[-s])), spl, seq_along(spl))
#[1]  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE

我按逗号分开,然后首先删除公用的"P1D3""0"值。
然后循环遍历spl以查看该特定集中的any中的值是否存在于spl中的其他位置。这由spl[-s]表示,返回spl,但当前正在处理的集合除外。