我正在使用分组和中位数,我想对data.frame
进行分组,其中包含某些行(不是全部)的中位数和最后一个值。
我的数据是这样的:
test <- data.frame(
id = c('A','A','A','A','A','B','B','B','B','B','C','C','C','C'),
value = c(1,2,3,4,5,3,4,5,1,8,3,4,2,9))
> test
id value
1 A 1
2 A 2
3 A 3
4 A 4
5 A 5
6 B 3
7 B 4
8 B 5
9 B 1
10 B 8
11 C 3
12 C 4
13 C 2
14 C 9
对于每个id
,我需要三个中央行(中位数可能有所不同,在这种情况下为三个)的中位数,然后是最后一个值。
首先,我只尝试了一个id
。
test_a <- test[which(test$id == 'A'),]
> test_a
id value
1 A 1
2 A 2
3 A 3
4 A 4
5 A 5
这是所需的输出, 拥有这个:
median(test_a[(nrow(test_a)-3):(nrow(test_a)-1),]$value) # median of three central values
tail(test_a,1)$value # last value
我用了这个:
library(tidyverse)
test_a %>% group_by(id) %>%
summarise(m = median(test_a[(nrow(test_a)-3):(nrow(test_a)-1),]$value),
last = tail(test_a,1)$value) %>%
data.frame()
id m last
1 A 3 5
但是当我尝试归纳为所有id时:
test %>% group_by(id) %>%
summarise(m = median(test[(nrow(test)-3):(nrow(test)-1),]$value),
last = tail(test,1)$value) %>%
data.frame()
id m last
1 A 3 9
2 B 3 9
3 C 3 9
我认为公式可以使用完整的数据集来计算最后的值和中位数,但是我无法想象如何使其起作用。预先感谢。
答案 0 :(得分:0)
这有效:
test %>%
group_by(id) %>%
summarise(m = median(value[(length(value)-3):(length(value)-1)]),
last = value[length(value)])
# A tibble: 3 x 3
id m last
<fctr> <dbl> <dbl>
1 A 3 5
2 B 4 8
3 C 4 9
您只引用变量value
而不是summarise
中的整个数据集。
编辑:这是通用版本。
test %>%
group_by(id) %>%
summarise(m = ifelse(length(value) == 1, value,
ifelse(length(value) == 2, median(value),
median(value[(ceiling(length(value)/2)-1):(ceiling(length(value)/2)+1)])),
last = value[length(value)])
如果一组只有一行,则值本身将存储在m
中。如果只有两行,则这两行中的median
将存储在m
中。如果它具有三行或更多行,则将动态选择中间三行,并将其中的median
个存储在m
中。