[英]Question Using group_by/summarise or group_by/mutate in Base R
[英]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.