R计算某些行的组中位数和最后一行

时间:2018-06-28 08:22:41

标签: r tidyr

我正在使用分组和中位数,我想对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

我认为公式可以使用完整的数据集来计算最后的值和中位数,但是我无法想象如何使其起作用。预先感谢。

1 个答案:

答案 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中。