Как убрать каждую возможность дублирования на основе каких-либо условий? - PullRequest
0 голосов
/ 09 января 2020

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

my_data <- data.frame("R" = c("A", "A"),
                      "P" = c(1, 1),
                      "DD" = c("01/01/2020", "01/01/2020"),
                      "DF" = c("31/12/2020", "31/12/2020"),
                      stringsAsFactors = FALSE)

После того, как вы прочтете то, что ниже, я хотел бы знать, является ли это правильным способом решения проблемы или есть другой взгляд на нее.

И моя проблема в том, что у меня может быть много разных случаев дубликатов, и мне удалось обработать 2 из них:

Случай 1 -> P, DD и DF все одинаковы

Решение 1 -> Сохранить только одну строку

Случай 2 -> DD, DF одинаковы, а P отличается

Решение 2 -> Сохранить наименьшее значение P

Теперь вот какой-то случай, я бы хотел найти решение для них:

Случай 3 -> DD - это то же самое, P больше min(P) и DF меньше DF значения min(P)

Пример случая 3:

my_case3 <- data.frame("R" = c("A", "A", "A", "A"),
                       "P" = c(8, 7, 10, 19),
                       "DD" = c("01/01/2020", "01/01/2020", "01/01/2020", "01/01/2020"),
                       "DF" = c("31/12/2020", "30/12/2020", "30/10/2020", "30/09/2020"),
                       stringsAsFactors = FALSE)

Результат 3:

my_result3 <- data.frame("R" = c("A", "A"),
                         "P" = c(8, 7),
                         "DD" = c("01/01/2020", "01/01/2020"),
                         "DF" = c("31/12/2020", "30/12/2020"),
                         stringsAsFactors = FALSE)

Случай 4 -> DF - то же самое, P больше min(P) и DD больше DD значения min(P)

Пример дела 4:

my_case4 <- data.frame("R" = c("A", "A", "A", "A"),
                       "P" = c(6, 7, 8, 9),
                       "DD" = c("01/05/2020", "01/06/2020", "01/01/2020", "01/06/2020"),
                       "DF" = c("31/12/2020", "31/12/2020", "31/12/2020", "31/12/2020"),
                       stringsAsFactors = FALSE)
* 1 049 * Результат 4:
my_result4 <- data.frame("R" = c("A", "A"),
                         "P" = c(6, 8),
                         "DD" = c("01/05/2020", "01/01/2020"),
                         "DF" = c("31/12/2020", "31/12/2020"),
                         stringsAsFactors = FALSE)

Случай 5 -> Тот же P тот же

Результат 5 -> Держите одну строку с самым низким DD и самым большим DF значение

Это единственное, о чем я могу подумать, поэтому если я забуду некоторые из них, дайте мне сейчас.

Я использую dplyr, это мой код для решения первого случая:

my_data$num <- seq.int(from = 1, to = nrow(my_data), by = 1)

temp <- my_data[duplicated(my_data$R) | duplicated(my_data$R, fromLast = TRUE),]
my_same <- temp %>%
  group_by(R) %>%
  filter(n_distinct(`DD`) == 1 & n_distinct(`DF`) == 1 & n_distinct(P) == 1) %>%
  ungroup()
my_same2 <- my_same[duplicated(my_same$R),]
if (nrow(my_same2) > 0) {
  my_data <- my_data[!(my_data$num %in% my_same2$num),]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...