簡體   English   中英

使用 Group_by 在 r 中的前 5 名和后 5 名

[英]Top 5 and bottom 5 in r using Group_by

我正在尋找為 5 個最高值和 5 個最低值分配一個值的代碼或功能。 例如,這可能來自與此類似的數據集:

df <- data.frame(
   Date = c(rep("2010-01-31",16), rep("2010-02-28", 14)), 
   Value=c(rep(c(1,2,3,4,5,6,7,8,9,NA,NA,NA,NA,NA,15),2))
)

編輯:這只是一個示例數據。 我使用的數據更復雜,因此代碼應該允許日期列的不同長度以及缺失的多個值 (NA)。

然后,我希望將一個值分配給等於“5w”的五個最低值,將“5b”分配給 5 個最高值 然后應根據日期將數據包裝在 group_by 中,以便在每個時期重復該過程。 我曾嘗試使用百分位數,但此方法不會在每個括號中保持恆定數量的值。 因此,我正在尋找一種方法,使每個括號中的值數量保持不變。 如果可能的話,最好將所有公司放入 5% 的括號中。 通過這個,我的意思是有 20 個括號,所有公司都分布。 這意味着最佳組將包括具有最高價值的公司總數的 5%。 值可以是 0:19。 即意味着最高價值等級的公司的預期產出為 19,最低價值等級的公司的預期產量為 0。

提前致謝

注意:雖然我懷疑這只是樣本數據,但您在2010-01-31有兩個1 這段代碼說明了這一點,但是當未排序時,輸出看起來很奇怪。 為此,我正在添加arrange以顯示它們。

我在這里使用min_rank ,假設你不想要min_rank並且總是想要頂部/底部 5。另一種選擇是dense_rank ,它會標記2010-01-31前六名,因為1

library(dpyr)
dat %>%
  group_by(Date) %>%
  mutate(
    R = min_rank(Value),
    Quux = case_when(
      R < 6       ~ "5w",
      R > n() - 5 ~ "5b",
      TRUE        ~ NA_character_)
    ) %>%
  ungroup() %>%
  arrange(Date, Value) %>%
  print(n=99)
# # A tibble: 30 x 4
#    Date       Value     R Quux 
#    <fct>      <int> <int> <chr>
#  1 2010-01-31     1     1 5w   
#  2 2010-01-31     1     1 5w   
#  3 2010-01-31     2     3 5w   
#  4 2010-01-31     3     4 5w   
#  5 2010-01-31     4     5 5w   
#  6 2010-01-31     5     6 <NA> 
#  7 2010-01-31     6     7 <NA> 
#  8 2010-01-31     7     8 <NA> 
#  9 2010-01-31     8     9 <NA> 
# 10 2010-01-31     9    10 <NA> 
# 11 2010-01-31    10    11 <NA> 
# 12 2010-01-31    11    12 5b   
# 13 2010-01-31    12    13 5b   
# 14 2010-01-31    13    14 5b   
# 15 2010-01-31    14    15 5b   
# 16 2010-01-31    15    16 5b   
# 17 2010-02-28     2     1 5w   
# 18 2010-02-28     3     2 5w   
# 19 2010-02-28     4     3 5w   
# 20 2010-02-28     5     4 5w   
# 21 2010-02-28     6     5 5w   
# 22 2010-02-28     7     6 <NA> 
# 23 2010-02-28     8     7 <NA> 
# 24 2010-02-28     9     8 <NA> 
# 25 2010-02-28    10     9 <NA> 
# 26 2010-02-28    11    10 5b   
# 27 2010-02-28    12    11 5b   
# 28 2010-02-28    13    12 5b   
# 29 2010-02-28    14    13 5b   
# 30 2010-02-28    15    14 5b   

使用新發現的數據進行編輯 我推斷應該忽略NA值,只應該考慮排名的值。 這顯示了沒有 10 個總值行的情況,因為2010-02-28僅提供 4 5b

dat %>%
  group_by(Date) %>%
  mutate(
    R = min_rank(Value),
    Quux = case_when(
      R < 6                        ~ "5w",
      R > max(R, na.rm = TRUE) - 5 ~ "5b",
      TRUE                         ~ NA_character_)
    ) %>%
  ungroup() %>%
  arrange(Date, Value) %>%
  print(n=99)

# # A tibble: 30 x 4
#    Date       Value     R Quux 
#    <fct>      <dbl> <int> <chr>
#  1 2010-01-31     1     1 5w   
#  2 2010-01-31     1     1 5w   
#  3 2010-01-31     2     3 5w   
#  4 2010-01-31     3     4 5w   
#  5 2010-01-31     4     5 5w   
#  6 2010-01-31     5     6 <NA> 
#  7 2010-01-31     6     7 5b   
#  8 2010-01-31     7     8 5b   
#  9 2010-01-31     8     9 5b   
# 10 2010-01-31     9    10 5b   
# 11 2010-01-31    15    11 5b   
# 12 2010-01-31    NA    NA <NA> 
# 13 2010-01-31    NA    NA <NA> 
# 14 2010-01-31    NA    NA <NA> 
# 15 2010-01-31    NA    NA <NA> 
# 16 2010-01-31    NA    NA <NA> 
# 17 2010-02-28     2     1 5w   
# 18 2010-02-28     3     2 5w   
# 19 2010-02-28     4     3 5w   
# 20 2010-02-28     5     4 5w   
# 21 2010-02-28     6     5 5w   
# 22 2010-02-28     7     6 5b   
# 23 2010-02-28     8     7 5b   
# 24 2010-02-28     9     8 5b   
# 25 2010-02-28    15     9 5b   
# 26 2010-02-28    NA    NA <NA> 
# 27 2010-02-28    NA    NA <NA> 
# 28 2010-02-28    NA    NA <NA> 
# 29 2010-02-28    NA    NA <NA> 
# 30 2010-02-28    NA    NA <NA> 

嘗試這個

library(dplyr)

DF <- data.frame(Date = c(rep("2010-01-31",16), rep("2010-02-28", 14)), Value=c(rep(1:15,2)))

DF %>% 
  group_by(Date) %>%
  mutate(n = row_number(),
         nn = 1 + max(n) - n) %>%
  ungroup() %>%
  filter(n <= 5 | nn <= 5) %>%
  mutate(v1 = if_else(n <= 5, "5b", "5w")) %>%
  select(-n, -nn)

輸出

# A tibble: 20 x 3
   Date       Value v1   
   <fct>      <int> <chr>
 1 2010-01-31     1 5b   
 2 2010-01-31     2 5b   
 3 2010-01-31     3 5b   
 4 2010-01-31     4 5b   
 5 2010-01-31     5 5b   
 6 2010-01-31    12 5w   
 7 2010-01-31    13 5w   
 8 2010-01-31    14 5w   
 9 2010-01-31    15 5w   
10 2010-01-31     1 5w   
11 2010-02-28     2 5b   
12 2010-02-28     3 5b   
13 2010-02-28     4 5b   
14 2010-02-28     5 5b   
15 2010-02-28     6 5b   
16 2010-02-28    11 5w   
17 2010-02-28    12 5w   
18 2010-02-28    13 5w   
19 2010-02-28    14 5w   
20 2010-02-28    15 5w  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM