簡體   English   中英

每個組的 R select 值

[英]R select values for each group

對於 WEEK 和 GROUP 的每個組合,我希望找到 TYPE == 'M' 的 SCORE 最低的那一天(1 或 2),然后保持 TYPE == 'M' 和 TYPE == 'E' 值相同天。

HAVE = data.frame("WEEK" = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4),
"GROUP" = c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'),
"SCORE" = c(29, 10, 19, 11, 28, 38, 23, 27, 32, 19, 32, 26, 35, 27, 39, 51, 43, 12, 35, 29, 14, 47, 12, 36, 17, 11, 24, 19, 19, 12, 33, 7),
"DAY" = c(1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2),
"TYPE" = c('M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E'))


WANT=data.frame("WEEK"=c(1, 1, 2, 2, 3, 3, 4, 4, 1, 1, 2, 2, 3, 3, 4, 4),
"GROUP"=c('A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'),
"SCORE"=c(19, 11, 23, 27, 32, 19, 35, 27, 35, 29, 12, 36, 17, 11, 19, 12),
"DAY"=c(2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1),
"TYPE"=c('M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E', 'M', 'E'),
"SCORE.MIN"=c(1, NA, 1, NA, 1, NA, 1, NA, 1, NA, 1, NA, 1, NA, 1, NA))

我有“擁有”並希望創建“想要”

對於 WEEK 和 GROUP 的每個組合,select TYPE = M 和 SCORE 最低的 DAY。 我可以做到這一點

WANT.ATTEMPT = HAVE %>%
group_by(WEEK, GROUP) %>%
mutate(SCORE.MIN = ifelse(TYPE == 'M', min(SCORE), NA))

然而,我想要的是數據集 WANT,如您所見,我按 WEEK 和 GROUP 分組並找到 TYPE == 'M' 的 SCORE 最小的日期,但我也保留 TYPE == 'E' 的 SCORE 相同天

更新以防止聯系。

你可以做:

HAVE %>%
  group_by(WEEK, GROUP) %>%
  filter(DAY == first(DAY[SCORE == min(SCORE[TYPE == 'M'])]) | TYPE == 'E') %>%
  filter(DAY %in% DAY[TYPE == 'M']) %>%
  ungroup()

# A tibble: 16 x 5
    WEEK GROUP SCORE   DAY TYPE 
   <dbl> <chr> <dbl> <dbl> <chr>
 1     1 A        19     2 M    
 2     1 A        11     2 E    
 3     2 A        23     2 M    
 4     2 A        27     2 E    
 5     3 A        32     1 M    
 6     3 A        19     1 E    
 7     4 A        35     1 M    
 8     4 A        27     1 E    
 9     1 B        35     2 M    
10     1 B        29     2 E    
11     2 B        12     2 M    
12     2 B        36     2 E    
13     3 B        17     1 M    
14     3 B        11     1 E    
15     4 B        19     1 M    
16     4 B        12     1 E    

我們也可以在分組之前先arrange ,然后進行filter

library(dplyr)
HAVE %>%
   arrange(WEEK, GROUP, TYPE != 'M', SCORE) %>%
   group_by(WEEK, GROUP) %>% 
   filter(DAY %in% DAY[TYPE == "M"][1]) %>%
   ungroup

-輸出

# A tibble: 16 × 5
    WEEK GROUP SCORE   DAY TYPE 
   <dbl> <chr> <dbl> <dbl> <chr>
 1     1 A        19     2 M    
 2     1 A        11     2 E    
 3     1 B        35     2 M    
 4     1 B        29     2 E    
 5     2 A        23     2 M    
 6     2 A        27     2 E    
 7     2 B        12     2 M    
 8     2 B        36     2 E    
 9     3 A        32     1 M    
10     3 A        19     1 E    
11     3 B        17     1 M    
12     3 B        11     1 E    
13     4 A        35     1 M    
14     4 A        27     1 E    
15     4 B        19     1 M    
16     4 B        12     1 E    

暫無
暫無

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

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