首页 > 解决方案 > 选择数据集中的第一个、最后一个和单个观察值

问题描述

有没有办法保持一个组的第一个和最后一个观察值(此处为 id1),以及具有单个观察值的组?

例如,如果我有:

   id1 id2
#1    1   1
#2    2   2
#3    2   3
#4    2   4
#5    2   5
#6    3   6
#7    3   7
#8    3   8
#9    4   9
#10   5  10
#11   5  11
#12   5  12

我想要:

  id1 id2
#1   1   1
#2   2   2
#3   2   5
#4   3   6
#5   3   8
#6   4   9
#7   5  10
#8   5  12

我尝试使用 dplyr group by id1 然后对第一行和最后一行进行切片,但它重复了我的单个观察结果。

对于奖励积分,我有另一个二进制变量,当这个变量==1时,我只想保留第一个和最后一个观察值:

     id1 id2 binary
#1    1   1      1
#2    2   2      1
#3    2   3      1
#4    2   4      1
#5    2   5      1
#6    3   6      0
#7    3   7      0
#8    3   8      0
#9    4   9      1
#10   5  10      1
#11   5  11      1
#12   5  12      1

我想要:

     id1 id2 binary
#1    1   1      1
#2    2   2      1
#5    2   5      1
#6    3   6      0
#7    3   7      0
#8    3   8      0
#9    4   9      1
#10   5  10      1
#12   5  12      1

谢谢!

标签: r

解决方案


我认为这应该适合你:

library(dplyr)

df <- tibble(
  id1 = c(1,2,2,2,2,3,3,3,4,5,5,5),
  id2 = 1:12,
  binary = c(1,1,1,1,1,0,0,0,1,1,1,1)
)

df %>%
  group_by(id1) %>%
  filter(
    # binary == 1, # uncomment this for bonus points :)
    row_number() == 1 | row_number() == n()
  ) %>%
  ungroup()

row_number()正在检查一个按组递增的序列,以仅保留那些是第一个 ( row_number() == 1)组中最后一个元素的行 ( row_number() == n(),其中n()为您提供每组中的观察次数)。

我相信有更优雅或计算效率更高的解决方案,但这至少应该可以解决问题。


推荐阅读