Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的多对字符串比较_R - Fatal编程技术网

R中的多对字符串比较

R中的多对字符串比较,r,R,我试图评估一个(字符串)变量的值是否与R数据帧中多个其他(字符串)变量的值匹配。如果至少有一个有效匹配,我希望返回True;如果不是,我想返回False 考虑这个玩具数据框: toydf<-data.frame( base1=c("DOG","CAT","MOUSE"), base2=c("FISH","RAT","BUNNY"), target=c("DOG","HORSE","BUNNY"), stringsAsFactors=FALSE) base1 bas

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

考虑这个玩具数据框:

toydf<-data.frame(
  base1=c("DOG","CAT","MOUSE"),
  base2=c("FISH","RAT","BUNNY"),
  target=c("DOG","HORSE","BUNNY"),
  stringsAsFactors=FALSE)

    base1 base2 target
  1   DOG  FISH    DOG
  2   CAT   RAT  HORSE
  3 MOUSE BUNNY  BUNNY
在这个简单的小示例中,我知道这可以通过以下方式轻松实现:

toydf$check<-toydf$target==toydf$base1 | toydf$target==toydf$base2
toydf$check
#怎么样:

bool还有一种可能性:

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$检查toydf
#base1 base2目标检查
#1狗鱼狗真
#2猫鼠马假
#3老鼠兔子兔子真的
当一个条目等于列
toydf$target
中指定的条目时,此代码对数据帧的每一行进行计数。因为我们没有从数据帧中排除这个目标列,所以总和总是至少为一(目标列中的条目显然等于它本身),因此我们需要通过减去1来纠正这一点。然后,根据计算值是否为零(其他列中的条目不等于目标列中的条目),将每行的结果分别转换为布尔值
FALSE
TRUE


希望这有帮助。

您想匹配任何目标,还是只匹配对应行中的目标?只匹配对应行中的目标。上面的代码适用于给定的测试数据,但当我将ydf$target更改为c(“a”、“b”、“c”)时,结果会出现FALSE、FALSE、TRUE。我想这不是我们想要的。也许:这非常优雅,但它使用整个toydf作为apply中的参数。这在我的示例中是有效的(这就在我身上!),但实际上,在数据帧中也会有其他不相关的变量,我不想与它们进行比较。在您的示例中,通过
toydf[1:2]
子设置toydf似乎不起作用。@ralm请检查更新的版本。您可以通过删除右侧不感兴趣的列来子集
toydf
。@修订版现在应该可以正常工作了。我对你描述的奇怪行为没有任何解释,我可以用以前的代码重现。谢谢,这很有效,你能告诉我这里发生了什么吗?对不起,有点太快了,我想我明白了。首先,用布尔值构造一个矩阵,将目标值与toydf中的前两列进行比较。然后创建一个向量/变量,如果任何布尔值(按行)为TRUE,该向量/变量将返回TRUE。对的很不错的!但我的代码会在toydf$target中的任何位置查找匹配项。如果您只想检查toydf$target的对应行,那么我喜欢上面RHertel中的代码。(或者我自己的版本,源于:apply(toydf[,1:2]==toydf$target,1,FUN=any)
toydf$baseall<-apply(toydf[1:2],1,function(x) list(x))
toydf$check<-toydf$target %in% toydf$baseall
# how about:
bool <- apply(toydf[,1:2], 2, FUN = "%in%", toydf$target)
toydf$check <- apply(bool, 1, any)
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