У меня есть фрейм данных, который выглядит следующим образом:
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),]
}