基于长格式的组计算中位数

Calculating median based on the group in long format

我的数据已经格式化成 long

df1<-read.table(text=" ID   Temp    location
1   12  4
1   18  3
1   17  5
1   10  1
1   19  1
1   15  4
1   16  5
1   10  3
1   11  5
1   15  1
2   20  3
2   10  3
2   17  1
2   13  5
2   12  1
2   14  4
2   20  5
2   13  1
2   13  3
2   10  3
3   12  4
3   18  3
3   18  3
3   15  1
3   17  1
3   15  4
3   10  1
3   11  3
3   13  1
3   14  1",header=TRUE)

我想根据 3 个组 (Id) 的温度和位置计算中位数(四舍五入)。问题是如果 location=1,id1、id2、id3 的中位数是多少。换句话说,10,19 和 15,给出中位数 15 或者对于 id2,我们有 17,12 和 13,给出中位数 13.5,roundup=14。等等。

所以我需要获取这些数据:

AM1 15
AM2 14
AM3 14

感谢您的帮助,很抱歉我无法展示我的努力。

一个选择是先 filter,然后按 median

进行分组
library(dplyr)
library(stringr)
df1 %>%
   filter(location ==1) %>%
   group_by(ID = str_c("AM", ID)) %>%
   summarise(Median = median(Temp))
# A tibble: 3 x 2
#  ID    Median
#  <chr>  <int>
#1 AM1       15
#2 AM2       13
#3 AM3       14

此外,可以做得更紧凑,但效率低下

df1 %>%
   group_by(ID) %>%
   summarise(Median = median(Temp[location == 1]))

您也可以使用 data.table.

library(data.table)
setDT(df1)[location == 1, .(Median = base::round(median(as.numeric(Temp)))), by = .(ID = paste0(“AM”, ID))]