tidyverse 中的条件 tiles

Conditional ntiles in tidyverse

我想使用 tidyverse 仅使用行的子集来计算 ntiles。以下基本 R 代码可以满足我的要求:

基数 R:

diamonds$conditional_quartiles_var                           <- NA
diamonds$conditional_quartiles_var[ diamonds$price >= 1000 ] <- ntile( diamonds$price[ diamonds$price >= 1000 ], n = 4 )
diamonds$conditional_quartiles_var[ diamonds$price <  1000 ] <- "Less than 1000"

diamonds %>% count(conditional_quartiles_var)

输出(我想要的):

# A tibble: 5 x 2
  conditional_quartiles_var     n
                      <chr> <int>
1                         1  9861
2                         2  9860
3                         3  9860
4                         4  9860
5            Less than 1000 14499

上面的结果是我想要的,因为ntiles只是根据价格>=1000的值计算的。

Tidyverse 尝试

我的 tidyverse 实现失败了,因为 ntiles 是根据整个价格向量计算的:

library(tidyverse)


diamonds %>% 
    mutate( wrong_conditional_quartiles_var = case_when(  price >= 1000 ~   ntile(price, n = 4) %>% as.character(),
                                                          price <  1000 ~   "Less than 1000")) %>%
    count( wrong_conditional_quartiles_var)

输出(不是我想要的):

# A tibble: 4 x 2
  wrong_conditional_quartiles_var     n
                            <chr> <int>
1                               2 12471
2                               3 13485
3                               4 13485
4                  Less than 1000 14499

我们可以使用 replace

library(dplyr)
diamonds %>%
   mutate(quart = "Less than 1000", 
          quart = replace(quart, price >= 1000, ntile(price[price>=1000], 4))) %>%
   count(quart)
# A tibble: 5 x 2
#           quart     n
#           <chr> <int>
#1              1  9861
#2              2  9860
#3              3  9860
#4              4  9860
#5 Less than 1000 14499