检查具有相应向量的数据帧的条件

Check condition of data frame with corresponding vector

让我们创建一些人工数据及其 0.99 分位数。

set.seed(42)
x = data.frame("Norm" = rnorm(100),
               "Unif" = runif(100),
               "Exp" = rexp(100))

quants <- apply(x, 2, quantile, 0.99)

我想检查没有循环变量的哪些元素大于 0.99 分位数。

所以第一个变量应该与 quants 的第一个元素进行比较,第二个与第二个和第三个与第三个进行比较。

我凭直觉使用了:x > quants 我检查了结果很好,因为 R 似乎将此命令解释为其他命令。

e.g. 

> head(x > quants)
      Norm  Unif   Exp
[1,] FALSE FALSE FALSE
[2,] FALSE FALSE FALSE
[3,] FALSE FALSE  TRUE
[4,] FALSE FALSE FALSE
[5,] FALSE FALSE FALSE
[6,] FALSE FALSE  TRUE

如您所见,Exp 的第三个元素应该表明它大于 0.99 分位数。然而:

> x[3, ][3] > quants[3] 
    Exp
3 FALSE 

给出错误。你知道我该如何解决这个问题吗?我尝试使用 apply 但不确定在这种情况下如何正确使用它。

你可以使用 purrr::map2_df.

# there are two objects I am iterating
# x data.frame is referenced as .x
# quants vector is referenced as .y
purrr::map2_df(x, quants, ~ .x > .y)

我认为以下代码可能会帮助您获得所需的输出:

library(purrr)

set.seed(42)
x = data.frame("Norm" = rnorm(100),
               "Unif" = runif(100),
               "Exp" = rexp(100))

quants <- apply(x, 2, quantile, 0.99)

map2_dfr(x, quants, ~ .x > .y)

# A tibble: 100 x 3
   Norm  Unif  Exp  
   <lgl> <lgl> <lgl>
 1 FALSE FALSE FALSE
 2 FALSE FALSE FALSE
 3 FALSE FALSE FALSE
 4 FALSE FALSE FALSE
 5 FALSE FALSE FALSE
 6 FALSE FALSE FALSE
 7 FALSE FALSE FALSE
 8 FALSE FALSE FALSE
 9 FALSE FALSE FALSE
10 FALSE FALSE FALSE
# ... with 90 more rows

如果您想坚持使用基本 R,这是另一种简单的方法:

head(mapply(function(x, y) x > y, x, quants)) 

      Norm  Unif   Exp
[1,] FALSE FALSE FALSE
[2,] FALSE FALSE FALSE
[3,] FALSE FALSE FALSE
[4,] FALSE FALSE FALSE
[5,] FALSE FALSE FALSE
[6,] FALSE FALSE FALSE

实际上,在检查 x > quants 时,R 检查它是按列而不是按行。第一行的第一个元素用第一个量子检查,第二行的第一个元素用第二个量子检查,依此类推。因此,当检查 x[3,3] 时,它实际上是本次迭代中的第 203 个元素,因此与 quants (203 %% 3 = 2) 的第二个元素一起检查。那是你遇到了错误。

另见

colSums(x > quants)

Norm Unif  Exp 
   4    0   19

找出给定语法中的错误。

这个怎么样,这里 x 是你的数据框,量化你想要比较和应用函数的值大于符号。此处按列进行扫描,因此 2:

sweep(x, 2,STATS=quants, `>`)