выберите первое, последнее и единичное наблюдение в наборе данных - PullRequest
1 голос
/ 22 октября 2019

Есть ли способ сохранить первое и последнее наблюдение группой (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 по 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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Я думаю, что это должно работать для вас:

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() дает вам количество наблюдений в каждой группе).

Я считаю, что есть более элегантные или вычислительно эффективные решения,но это должно, по крайней мере, сделать свое дело.

1 голос
/ 22 октября 2019

Это должно быть просто. Использование данных @ hansjaneinvielleicht:

df %>%
  group_by(id1) %>%
  slice(unique(c(1, n())))

# # A tibble: 8 x 3
# # Groups:   id1 [5]
#     id1   id2 binary
#   <dbl> <int>  <dbl>
# 1     1     1      1
# 2     2     2      1
# 3     2     5      1
# 4     3     6      0
# 5     3     8      0
# 6     4     9      1
# 7     5    10      1
# 8     5    12      1

Для дополнительного сохранения кредита двоичного 0:

df %>%
  group_by(id1, binary) %>%
  filter(row_number() %in% c(1L, n()) | binary < 1)
# # A tibble: 9 x 3
# # Groups:   id1, binary [5]
#     id1   id2 binary
#   <dbl> <int>  <dbl>
# 1     1     1      1
# 2     2     2      1
# 3     2     5      1
# 4     3     6      0
# 5     3     7      0
# 6     3     8      0
# 7     4     9      1
# 8     5    10      1
# 9     5    12      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...