基于长格式的组计算中位数
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))]
我的数据已经格式化成 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))]