Удалить почти идентичные строки фрейма данных по условию в R - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть фрейм данных с количеством практически идентичных строк. Мне нужно написать код, который позволил бы выбрать одну из строк в паре (или группе из 3 или 4) строк, которые похожи по имени, фамилии, V1 и P1, но отличаются по V2 и P2, а затем удалить ненужную строку. Какая строка должна быть сохранена, будет определено следующим условием: если P1 = P2, строка должна быть сохранена, если P1 P2, тогда строка с наибольшим P2 должна быть сохранена. .

id   Name  Surname     V1         P1       V2        P2
15  John    Smith     0.80        4       0.75        2    
16  John    Smith     0.80        4       1.00        3    
17  John    Smith     0.80        5       0.75        2    
18  John    Smith     0.80        5       1.00        3    
19  John    Smith     0.75        2       0.75        2    
20  John    Smith     0.75        2       1.00        3   

Результат, который я ожидаю, будет выглядеть следующим образом:

id  Name  Surname     V1          P1       V2        P2
16  John    Smith     0.80        4       1.00        3    
18  John    Smith     0.80        5       1.00        3    
19  John    Smith     0.75        2       0.75        2    

Есть ли простой способ сделать это?

Расширенный набор данных

id    Name Surname V1     P1    V2      P2
194   Lisa  Paul   0,1    1     0,2      1
195   Lisa  Paul   0,1    1     0,4      5
196   Lisa  Paul   0,1    4     0,5      1
197   Lisa  Paul   0,1    4     0,1      5
198   Lisa  Paul   0,1    2     0,1      1
199   Lisa  Paul   0,1    2     0,4      5
201   Lisa  Paul   0,1    3     0,2      1
202   Lisa  Paul   0,1    3     0,1      5
203   Lisa  Paul   0,1    5     0,3      1
204   Lisa  Paul   0,1    5     0,2      5
205   Lisa  Paul   0,1    6     0,2      1
206   Lisa  Paul   0,1    6     0,1      5

1 Ответ

0 голосов
/ 04 ноября 2018

По крайней мере с вашими примерами может показаться, что работает следующее:

library(tidyverse)
data %>% group_by(Name, Surname, P1) %>%
  filter(P2 == max(P2[P1 >= P2]))
# A tibble: 6 x 7
# Groups:   Name, Surname, P1 [6]
#      id Name  Surname    V1    P1    V2    P2
#   <int> <fct> <fct>   <dbl> <int> <dbl> <int>
# 1   194 Lisa  Paul      0.1     1   0.2     1
# 2   196 Lisa  Paul      0.1     4   0.5     1
# 3   198 Lisa  Paul      0.1     2   0.1     1
# 4   201 Lisa  Paul      0.1     3   0.2     1
# 5   204 Lisa  Paul      0.1     5   0.2     5
# 6   206 Lisa  Paul      0.1     6   0.1     5

Для каждой уникальной группы Имени, Фамилии и P1 я сохраняю те строки, которые имеют самый большой P2 из всех тех P2, которые не больше, чем соответствующий P1.

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