簡體   English   中英

使用分組數據選擇跨行和列的最大值

[英]Select a maximum value across rows and columns with grouped data

以下數據具有IndID字段以及包含數字的三列,在某些情況下包括NA,每個IndID具有不同的行數。

library(dplyr)
n = 10
set.seed(123)
dat <- data.frame(IndID = sample(c("AAA", "BBB", "CCC", "DDD"), n, replace = T),
                  Num1 = c(2,4,2,4,4,1,3,4,3,2),
                  Num2 = sample(c(1,2,5,8,7,8,NA), n, replace = T),
                  Num3 = sample(c(NA, NA,NA,8,7,9,NA), n, replace = T)) %>%
  arrange(IndID)

 head(dat)
  IndID Num1 Num2 Num3
1   AAA    1   NA    7
2   BBB    2   NA   NA
3   BBB    2    7    7
4   BBB    2   NA   NA
5   CCC    3    2    8
6   CCC    3    5   NA

對於每個IndID ,我想創建一個新列Max ,其中包含Num1Num3 在大多數情況下,這涉及在多個行和列中查找最大值。 dplyr我錯過了最后一步(下面),並希望得到任何建議。

dat %>%
  group_by(IndID) %>%
  mutate(Max = "???")

選項是pmax以獲得行數最大值

dat %>%        
   mutate(Max = pmax(Num1, Num2, Num3, na.rm = TRUE))

如果有很多列,我們可以獲取列名,將其轉換為符號然后評估( !!!

dat %>%        
    mutate(Max = pmax(!!! rlang::syms(names(.)[-1]), na.rm = TRUE))
# A tibble: 10 x 5
# Groups:   IndID [4]
#   IndID  Num1  Num2  Num3   Max
#   <fct> <dbl> <dbl> <dbl> <dbl>
# 1 AAA       1    NA     7     7
# 2 BBB       2    NA    NA     2
# 3 BBB       2     7     7     7
# 4 BBB       2    NA    NA     2
# 5 CCC       3     2     8     8
# 6 CCC       3     5    NA     5
# 7 DDD       4     8     7     8
# 8 DDD       4     7    NA     7
# 9 DDD       4     1     7     7
#10 DDD       4     1     7     7

如果要獲得按“IndID”分組的所有“Num”列的最大值,則有多種方法。

1)從上面的步驟,我們可以將它擴展到'IndID'組,然后取max行max('Max')

dat %>%        
    mutate(Max = pmax(!!! rlang::syms(names(.)[-1]), na.rm = TRUE)) %>% 
    group_by(IndID) %>% 
    mutate(Max = max(Max))

2)另一種選擇是使用gather將'wide'格式轉換為'long',然后按'IndID'分組,使用原始數據集獲取'val'列和right_joinmax

library(tidyverse)
gather(dat, key, val, -IndID) %>% 
    group_by(IndID) %>% 
    summarise(Max = max(val,na.rm = TRUE)) %>% 
    right_join(dat)

3)或者不重新變換為'long'格式的另一個選項是在'IndID'分組后nest數據集, unlist並獲得'Num'列的max

dat %>%
   group_by(IndID) %>%
   nest %>%
   mutate(data =  map(data,  ~ .x %>% 
                                mutate(Max = max(unlist(.), na.rm = TRUE)))) %>% 
   unnest

暫無
暫無

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

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