如何通过省略选定的行来检查是否有任何行具有负值?

时间:2016-08-01 05:24:11

标签: r

以下是我通过运行查询获得的数据帧。请注意,df1是一个动态数据帧,它可能会返回一个空的df或部分df而不是所有的四分之一,如下所示:

df1
   FISC_QTR_VAL                      Revenue
1       2014-Q1                         0.00
2       2014-Q2                    299111.86
3       2014-Q3                    174071.98
4       2014-Q4                    257655.30
5       2015-Q1                         0.00
6       2015-Q2                    317118.63
7       2015-Q3                    145461.88
8       2015-Q4                    162972.41
9       2016-Q1                     96896.04
10      2016-Q2                    135058.78
11      2016-Q3                    111773.77
12      2016-Q4                    138479.28
13      2017-Q1                    169276.04

我想检查Revenue列中所有行的值,看看是否有任何值为0或者是否为负,不包括2014-Q1行

此外,df1是动态的,只包含12个季度的数据,即当我到达下一个qtr即2017年第2季度时,与2014年第2季度相关的收入变为0,它将如下所示:

df1
   FISC_QTR_VAL                      Revenue
1       2014-Q1                         0.00
2       2014-Q2                         0.00
3       2014-Q3                    174071.98
4       2014-Q4                    257655.30
5       2015-Q1                         0.00
6       2015-Q2                    317118.63
7       2015-Q3                    145461.88
8       2015-Q4                    162972.41
9       2016-Q1                     96896.04
10      2016-Q2                    135058.78
11      2016-Q3                    111773.77
12      2016-Q4                    138479.28
13      2017-Q1                    169276.04
14      2017-Q2                    146253.64

在上述情况下,我需要通过排除2014年第一季度和2014年第二季度来检查“收入”列的所有行

随着季度的进展,这种情况继续发展

需要您的帮助来生成代码,该代码将动态执行上述排除行的所有步骤,并仅检查特定季度的重要行

目前,我使用以下代码:

Width

第一个IF循环检查df1中是否有数据 如果df为空,

df1[["FISC_QTR_VAL"]][nrow(df1)-10] == startQtr
条件将返回数字(0),其长度为0,因此条件失败

如果没有,则转到下一个IF循环并检查Revenue列中的-ve和0值。但它适用于所有行。我希望在这种情况下排除2014年第一季度,并且未来几个季度,我希望条件是动态的,如上所述。

此外,我不想在if条件之前切片数据集,因为如果初始数据帧df1返回1行或2行并且我们尝试将其进一步切片,则代码会抛出错误

由于

2 个答案:

答案 0 :(得分:0)

以下是使用dplyrtidyr软件包中的一些函数的解决方案。

这是一个可以使用的玩具数据集:

d <- data.frame(
  FISC_QTR_VAL = c("2015-Q1", "2014-Q2", "2014-Q1", "2015-Q2"),
  Revenue      = c(100, 200, 0, 0)
)
d
#>   FISC_QTR_VAL Revenue
#> 1      2015-Q1     100
#> 2      2014-Q2     200
#> 3      2014-Q1       0
#> 4      2015-Q2       0

请注意,FISC_QTR_VAL故意无序(作为预防措施)。

接下来,设置当前年份和季度的变量(您将看到为什么分开的原因):

current_year <- 2014
current_quarter <- 2

然后运行以下命令:

d %>%
  separate(FISC_QTR_VAL, c("year", "quarter"), sep = "-Q") %>% 
  arrange(year, quarter) %>%
  slice(which(year == current_year & quarter == current_quarter):n()) %>% 
  filter(Revenue <= 0)
#>   year quarter Revenue
#> 1 2015       2       0

首先,我们separate()FISC_QTR_VAL分为yearquarter个变量,用于(a)整洁的数据集和(b)订购数据的方式情况它是乱序的(如在这里使用的玩具)。然后我们arrange()数据,以便按yearquarter排序。然后,我们slice()离开当前版本之前的任何季度,然后filter()返回Revenue <= 0所有行。

或者,例如,为了获得返回的行数的计数,您可以管道nrow()之类的内容。

答案 1 :(得分:0)

您是否可以选择subset函数?

exclude.qr <- c("2014-Q1", "2014-Q2")

df <- data.frame(
  FISC_QTR_VAL = c("2014-Q1", "2014-Q2", "2014-Q3", "2014-Q4"),
  Revenue = c(0.00, 299111.86, 174071.98, 257655.30))

subset(
  df,
  FISC_QTR_VAL != exclude.qr, Revenue > 0)

您可以轻松地动态创建exclue.qr,例如通过pasteyears <- 2010:END

我希望这对您有所帮助!