message () в R - использование вывода для передачи в качестве входного сообщения - PullRequest
0 голосов
/ 12 апреля 2020

Пишу в операторе if, который проверяет дубликаты. Если есть какие-либо, я хочу продолжить выполнение, но вернуть сообщение, указывающее, какие являются дубликатами. я попытался message(), но я не уверен, как включить значения locations.

 if(anyDuplicated(regionGroups$location) > 0){
   duplicateRegions <- regionGroups[, 'count' := .N, by = location][count > 1, .SD[1], by = location][[1]]
   message("Location is not unique in the table regionGroups. There are length(duplicateRegions) duplicated locations, namely: duplicateRegions[1],duplicateRegions[2]  ")
   regionGroups <- regionGroups[!duplicated(regionGroups$location)]
 }


(anyDuplicated(regionGroups$location) > 0)
[1] TRUE

dupplicateRegions
[1] 55100 26080

желаемый результат:

Location is not unique in the table regionGroups. There are 2 duplicated locations, namely: 55100, 26080

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

ВОПРОС: Как записать оператор message() так, чтобы на выходе были перечислены соответствующие значения duplicateRegions?

1 Ответ

0 голосов
/ 12 апреля 2020

Привет, это работает для вас? Я немного не уверен в том, зачем вам нужен оператор if, если вы все равно собираетесь его выполнить, так как кажется, что элемент else не требуется, возможно, вы упустили это для простоты.

Еще один момент, на который следует обратить внимание: duplicated не выбирает первый из дубликатов в дублированном наборе, поэтому при использовании: regionGroups[!duplicated(regionGroups$location),] он всегда удаляет все, кроме первого дубликата. Это может быть хорошо для вас, но просто как предупреждение.

Также, если вы воспользуетесь этим подходом: namely: duplicateRegions[1],duplicateRegions[2] в функции сообщения вы предполагаете, что знаете, сколько у вас будет дубликатов, что было бы не так. Вы можете просто свернуть строку с помощью: paste(as.character(regionGroups$location[dups]), collapse = ", ")), так что вам не нужно об этом беспокоиться.


if(any(duplicated(regionGroups$location))){
  dups <- which(duplicated(regionGroups$location))
  dup_regions <- regionGroups$location[dups]
  message(" Location is not unique in the table regionGroups. There are ", 
          length(dups)," duplicated locations, namely: ", paste(as.character(regionGroups$location[dups]), collapse = ", "))
  regionGroups <- regionGroups[!duplicated(regionGroups$location),]
}
...