[英]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
,其中包含Num1
: Num3
。 在大多數情況下,這涉及在多個行和列中查找最大值。 在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_join
的max
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.