【问题标题】:How to check if any row has negative values by leaving out selected rows?如何通过省略选定的行来检查任何行是否具有负值?
【发布时间】:2016-08-01 05:24:10
【问题描述】:

下面是我通过运行查询获得的数据框。请注意,df1 是一个动态数据框,它可能会返回一个空 df 或部分 df,其中并非所有季度如下所示:

df1 FISC_QTR_VAL 收入 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

我想检查收入列中所有行的值,看看除 2014-Q1 行之外是否有任何值为 0 或负数

此外,df1 是动态的,将仅包含 12 个季度的数据,即当我到达下一个季度(即 2017-Q2)时,与 2014-Q2 相关的收入变为 0,它看起来像这样:

df1 FISC_QTR_VAL 收入 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-Q1 和 2014-Q2 来检查收入列的所有行

这会随着季度的进展而继续

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

目前,我正在使用以下代码:

        #Taking the first df1 into consideration which has 2017-Q1 as the last quarter
        startQtr <- "2014-Q2" #This value is dynamically achieved and will change as we move ahead. Next quarter, the value changes to 2014-Q3 and so on     
        if(length(df1[["FISC_QTR_VAL"]][nrow(df1)-11] == startQtr) == 1){

        if(nrow(df1[df1$Revenue < 0,]) == 0 & nrow(df1[df1$Revenue == 0,]) == 0){

          df1 <- df1 %>% slice((nrow(df1)-11):(nrow(df1)))
          }
        }

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

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

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

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

谢谢

【问题讨论】:

  • 你的预期输出是什么
  • 很难分析输出,因为它是一个长期的线性回归过程。上述方法只是我们输入数据并检查选择行中的异常(如 0 或负值)的起点

标签: r


【解决方案1】:

这是一个使用 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 &lt;= 0 所在的所有行。

例如,要获取返回的行数的计数,您可以使用类似nrow() 的管道。

【讨论】:

    【解决方案2】:

    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 &lt;- 2010:END

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2020-05-27
      相关资源
      最近更新 更多