我试图评估一个(字符串)变量的值是否与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 的所有值的向量。我怀疑这与在数据框中创建列表的方式有关,但我不知道如何解决这个问题。
任何帮助将不胜感激。谢谢。
答案 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来纠正它。每行的结果是转换为布尔FALSE
或TRUE
,具体取决于计算值是否为零(其他列中的条目不等于target
列中的条目)。
希望这有帮助。
答案 1 :(得分:0)
# how about:
bool <- apply(toydf[,1:2], 2, FUN = "%in%", toydf$target)
toydf$check <- apply(bool, 1, any)