R中的多个成对字符串比较

时间:2016-01-28 16:46:12

标签: r

我试图评估一个(字符串)变量的值是否与R数据帧中的多个其他(字符串)变量的值相匹配。如果至少有一个有效匹配,我想返回True;如果没有,我想返回False。

考虑这个玩具数据框:

toydf$check<-toydf$target==toydf$base1 | toydf$target==toydf$base2

我想将 target 中的值与 base1 base2 中的值进行比较,并返回 TRUE 至少有一个匹配,否则 FALSE

toydf$baseall<-apply(toydf[1:2],1,function(x) list(x))
toydf$check<-toydf$target %in% toydf$baseall

在这个简单的小例子中,我知道这可以通过以下方式轻松实现:

{{1}}

但是,在实际的数据集中,我有大量的 base 变量来检查匹配项,所以我想避免重复这些变量。声明。

我尝试使用%in%来实现这一点,但为了做到这一点,我首先必须收集 base1 base2 <的值/ em>在列表或向量中:

{{1}}

但是,这会返回一个包含 FALSE 的所有值的向量。我怀疑这与在数据框中创建列表的方式有关,但我不知道如何解决这个问题。

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:2)

这是另一种可能性:

toydf$check <- as.logical(rowSums(toydf==toydf$target)-1)
#> toydf
#  base1 base2 target check
#1   DOG  FISH    DOG  TRUE
#2   CAT   RAT  HORSE FALSE
#3 MOUSE BUNNY  BUNNY  TRUE

此代码计算数据帧的每一行,其中条目等于列toydf$target中指定的条目。由于我们没有从数据帧中排除这个目标列,因此总和至少为1(目标列中的条目显然等于它自己),因此我们需要通过减去1来纠正它。每行的结果是转换为布尔FALSETRUE,具体取决于计算值是否为零(其他列中的条目不等于target列中的条目)。

希望这有帮助。

答案 1 :(得分:0)

# how about:
bool <- apply(toydf[,1:2], 2, FUN = "%in%", toydf$target)
toydf$check <- apply(bool, 1, any)