R 用相应的向量检查数据帧的条件

R 用相应的向量检查数据帧的条件,r,dataframe,apply,R,Dataframe,Apply,让我们创建一些人工数据及其0.99分位数 set.seed(42) x = data.frame("Norm" = rnorm(100), "Unif" = runif(100), "Exp" = rexp(100)) quants <- apply(x, 2, quantile, 0.99) 如您所见,Exp的第三个元素应该表示它大于0.99分位数。然而: >

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

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

quants <- apply(x, 2, quantile, 0.99)
如您所见,Exp的第三个元素应该表示它大于0.99分位数。然而:

> x[3, ][3] > quants[3] 
    Exp
3 FALSE 
给假。你知道我如何解决这个问题吗?我尝试使用apply,但不确定在这种情况下如何正确使用它。

您可以使用purrr::map2\u df

您可以使用purrr::map2_df


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

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


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

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

实际上,当检查x>quants时,R会按列而不是按行检查它。第一行的第一个元素用第一个数量检查,第二行的第一个元素用第二个数量检查,依此类推。因此,当检查x[3,3]时,它实际上是本次迭代中的第203个元素,因此使用第二个元素quants 203%%3=2进行检查。那就是你犯了一个错误

也看到

colSums(x > quants)

Norm Unif  Exp 
   4    0   19
它在给定语法中定位错误。

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

也看到

colSums(x > quants)

Norm Unif  Exp 
   4    0   19

它在给定语法中定位错误。

这个怎么样,这里x是您的数据帧,量化您想要比较的值,并且应用的函数大于symbol。此处按列方式应用扫描,因此2:

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

这个怎么样,这里x是您的数据帧,量化您想要比较的值,并且应用的函数大于symbol。此处按列方式应用扫描,因此2:

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


好吧,我没有注意到dear@Jakub发布的第一个答案。当我自己打字的时候。他们基本上是一样的,但他值得表扬。老实说,我从你的答案中选择了.x>.y而不是>.x,.y。我不知道你能做到这一点,没有回击。哦,非常感谢。我还以为你是第一个问这个问题的人呢。这是我的荣幸,我很抱歉给你的回复贴上类似的回复。谢谢你的投票,你应得的更多。我之所以使用.x>.y,是因为它是purrr样式的lambda,它使用公式接口定义函数,并将由as\u mapper转换为函数。你也可以在其中输入公式并自己检查:作为_mapper~.x>.y只需将它运行到你的控制台中,看看它是如何被解释为函数的。我相信purrr充满了奇迹,每次我阅读文档,我都学到了一些新东西。在我看来,这是继rlang之后第二个最复杂的软件包。好吧,我没有注意到dear@Jakub发布的第一个答案。当我自己打字的时候。他们基本上是一样的,但他值得表扬。老实说,我从你的答案中选择了.x>.y而不是>.x,.y。我不知道你能做到这一点,没有回击。哦,非常感谢。我还以为你是第一个问这个问题的人呢。这是我的荣幸,我很抱歉给你的回复贴上类似的回复。谢谢你的投票,你应得的更多。我之所以使用.x>.y,是因为它是purrr样式的lambda,它使用公式接口定义函数,并将由as\u mapper转换为函数。你也可以在其中输入公式并自己检查:作为_mapper~.x>.y只需将它运行到你的控制台中,看看它是如何被解释为函数的。我相信purrr充满了奇迹,每次我阅读文档,我都学到了一些新东西。在我看来,这是继rlang之后第二个最复杂的软件包。非常感谢您的回答!你真的认为必须使用外部软件包才能做到这一点吗?我认为你也可以在BaseR中做到这一点。只是我更熟悉purrr语法。非常感谢您的回答!你真的认为必须使用外部软件包才能做到这一点吗?我认为你也可以在BaseR中做到这一点。只是我更熟悉purrr语法。这是一个很好的语法!然而,您如何指定我们感兴趣的扫描函数中的哪个分位数?e、 g.0。99@John我不知道我是否理解你的意思,但你是否至少已经计算了你提到的数量。哦,对不起,我误读了你的答案!这似乎是最简洁的答案,并且按照OP的要求以R为底。这是一个很好的答案!然而,您如何指定我们感兴趣的扫描函数中的哪个分位数?e、 g.0。99@John我不知道我是否理解你的意思,但你是否至少已经计算了你提到的数量。哦,对不起,我误读了你的答案!这似乎是最简洁的答案,根据OP的要求以R为基数。