首页 > 解决方案 > 为什么我的“如果”论点不能解释为合乎逻辑的

问题描述

我正在处理一些数据并尝试进行一些条件过滤。我想编写一个语句来评估一个变量是否等于一个数字(在本例中为 1),如果是,则根据另一列的值进行过滤。结果应该是所有 AtBatPitchSequences == 1 也有 PitchType == "FA"。

我的数据(firsttwopitches)如下所示:

  YearID GameID GamePitchSequen~ PAofInning AtBatPitchSeque~ Inning Balls Strikes PitchType
   <dbl> <chr>             <dbl>      <dbl>            <dbl>  <dbl> <dbl>   <dbl>     <chr>
1   2018 DFCBC~                1          1                1      1     0       0        FA
2   2018 DFCBC~                2          1                2      1     1       0        FA
3   2018 DFCBC~                4          2                1      1     0       0        FA
4   2018 DFCBC~                5          2                2      1     0       1        SI
5   2018 DFCBC~                8          3                1      1     0       0        FA
6   2018 DFCBC~                9          3                2      1     0       1        FA

为了解决这个问题,我尝试使用 if 语句:

library(tidyverse)

firsttwopitches %>%
  if (AtBatPitchSequence == 1) {
    filter(PitchType == "FA")
  }

但是,这会引发错误和警告:

Error in if (.) AtBatPitchSequence == 1 else { : 
  argument is not interpretable as logical
In addition: Warning message:
In if (.) AtBatPitchSequence == 1 else { :
  the condition has length > 1 and only the first element will be used

我不明白为什么我的论点不能被解释为合乎逻辑的。在我看来,它应该评估 AtBatPitchSequence 是否等于 1,然后转到下一行。另外,警告信息是什么意思?如果通过更正我的 if 语句来处理此警告,请不要担心,但我仍然是新手,并且正在尝试更好地调试我自己的工作。我在 if/while (condition) 中通读了这个错误:参数不能解释为逻辑问题,其他人试图找到我的错误但没有成功。

非常感谢你

标签: rdplyrdata-munging

解决方案


我们可以使用&条件filter

library(dplyr)
firsttwopitches %>%   
   filter(AtBatPitchSequence == 1, PitchType == "FA")

如果我们想保留 'AtBatPitchSequence' 不等于 1 的行,则添加另一个表达式|

firsttwopitches %>% 
    filter((AtBatPitchSequence == 1 & PitchType == "FA")|AtBatPitchSequence != 1) 

有两个问题 - 1)if/else没有矢量化,2) 与代码的阻塞有关,{}尤其是在管道中使用时 ( %>%)。一个相关的问题也是在AtBatPitchSequencetidyverse 函数之外查找列名 iemutatesummarise。在这种情况下,我们还需要指定数据.$AtBatPitchSequence


可以使用内置数据集重现错误/警告

data(iris)
head(iris) %>% 
   if(Species == 'setosa') {
       filter(Petal.Length > 1.5)
    }

if (.) Species == "setosa" else { : 参数不能解释为逻辑错误另外:警告消息:在 if (.) Species == "setosa" else { :条件的长度 > 1 并且只有将使用第一个元素

现在,我们可以通过阻塞 within 来消除错误{},但请注意警告仍然if/else没有矢量化,这也可能给出不正确的输出(下面的输出是正确的,但这只是因为只有一行具有 TRUE 条件遇见)

head(iris) %>% 
    {if(.$Species == 'setosa') {
        filter(., Petal.Length > 1.5)
     }}
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.4         3.9          1.7         0.4  setosa

警告消息:在 if (.$Species == "setosa") { 中:条件的长度 > 1 并且只使用第一个元素

如果我们在filter(中使用多个表达式,将生成&)

head(iris) %>% 
    filter(Species == 'setosa', Petal.Length > 1.5)
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.4         3.9          1.7         0.4  setosa

推荐阅读