выбрать повторные ряды наблюдений с наименьшей абсолютной разницей - PullRequest
4 голосов
/ 16 мая 2019

У меня есть такой фрейм данных:

df <- data.frame(id = c(1,1,1,2,2,3,3,3,3),
                  vars = c(1,2,5, 1,3, 0,2,4,-1))

> df
  id vars
1  1    1
2  1    2
3  1    5
4  2    1
5  2    3
6  3    0
7  3    2
8  3    4
9  3   -1

В этом фрейме данных каждый id может иметь несколько наблюдений.Теперь я хочу выбрать для каждой id пары (2 наблюдения), которые имеют наименьшую абсолютную разницу для vars.

. В приведенном выше случае это будет

  id vars
1  1    1
2  1    2
3  2    1
4  2    3
5  3    0
6  3   -1

дляid 1, значения 1 и 2 имеют самую низкую абсолютную разницу, id 2 имеет только 2 наблюдения, поэтому оба выбираются автоматически.для id 3 выбранные переменные будут 0 и -1, потому что абсолютная разница равна 1, что ниже, чем у всех других комбинаций.

Ответы [ 2 ]

8 голосов
/ 16 мая 2019

Вам не нужно делать все сравнения (или вы можете позволить arrange делать ваши сравнения за вас), потому что после того, как вы отсортировали значения, каждое значение уже находится рядом со значением, для которого разница минимизирована .

df %>% 
  group_by(id) %>% 
  arrange(vars) %>% 
  slice(which.min(diff(vars)) + 0:1)

# # A tibble: 6 x 2
# # Groups:   id [3]
#      id  vars
#   <dbl> <dbl>
# 1     1     1
# 2     1     2
# 3     2     1
# 4     2     3
# 5     3    -1
# 6     3     0

версия data.table

library(data.table)
setDT(df)

df[df[order(vars), .I[which.min(diff(vars)) + 0:1], id]$V1]

#    id vars
# 1:  3   -1
# 2:  3    0
# 3:  1    1
# 4:  1    2
# 5:  2    1
# 6:  2    3
1 голос
/ 16 мая 2019

Не самый лаконичный, но работает. Возможно, кто-то может улучшить идею.

df1%>%group_by(id)%>%mutate(vars2=which.min(abs(diff(combn(num(vars),2)))))%>%
  mutate(vars1=ifelse(vars%in%combn(num(vars),2)[,vars2],vars,NA))%>%select(id,vars1)%>%.[complete.cases(.),]

# A tibble: 6 x 2
# Groups:   id [3]
     id vars1
  <dbl> <dbl>
1     1     1
2     1     2
3     2     1
4     2     3
5     3     0
6     3    -1

Основная идея - сделать разницу во всех возможных комбинациях значений каждой группы. vars2 сохраняет столбец с самой низкой разницей. Если значение является одним из двух, присутствующих в столбце vars2, оно сохраняется. Иначе, это установлено как NA. Затем возвращаются только полные дела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...