Если необходимо удалить элементы, которые имеют OTHER
, а все элементы, отмеченные OTHER
, являются дубликатами названия другой страны, мы можем просто выбрать строки, в которых страна не равна OTHER
.
library(data.table)
code <- c(104, 105, 105, 106, 109, 112, 115, 115)
country <- c("GERMANY", "IRLAND", "OTHER", "FRANCE", "FRANCE", "ITALY", "OTHER", "LUXEMBURG")
id_country <- cbind(code, country)
id_country <- as.data.table(id_country)
id_country[country != "OTHER",]
Если в списке есть «действительные» неизвестные страны (т. Е. Не дублирующийся код страны с именем OTHER
, решение немного сложнее.
Сначала мы найдем дублированные страны после изменения входных данных с действительной OTHER
, страна 117.
library(data.table)
code <- c(104, 105, 105, 106, 109, 112, 115, 115,117)
country <- c("GERMANY", "IRLAND", "OTHER", "FRANCE", "FRANCE", "ITALY", "OTHER",
"LUXEMBURG","OTHER")
id_country <- cbind(code, country)
id_country <- as.data.table(id_country)
dupCodes <- id_country[, 'count' := .N, by = code][count > 1,.SD[1],by = code][[1]]
Тогда мы будем удалять только те строки, где country
равно OTHER
и там являются дубликатами code
.
id_country[country != "OTHER" | !(code %in% dupCodes),]
... и вывода:
> id_country[country != "OTHER" | !(code %in% dupCodes),]
code country
1: 104 GERMANY
2: 105 IRLAND
3: 106 FRANCE
4: 109 FRANCE
5: 112 ITALY
6: 115 LUXEMBURG
7: 117 OTHER
>
Исправление исходной ошибки кодирования
Как изначально написано, код в сообщение с вопросом содержит небольшую ошибку, из-за которой всегда завершается последняя операция поднабора.
duplicates <- id_country[duplicated(code),]
Поскольку duplicates
является вектором data.table
, а не цифрой c, следующий фрагмент кода всегда оценивает в FALSE.
id_country$code %in% duplicates
Тот факт, что этот код находится внутри блока if()
, затрудняет понимание того, что duplicates
является таблицей данных, поскольку мы не можем видеть ее в средстве просмотра среды RStudio. Если я запускаю блок кода вне блока if()
, Осмотрев объект, я вижу следующее.
Очевидно, duplicates
не является вектором.
Эта проблема приводит к тому, что оставшаяся часть операции поднабора возвращает каждую строку из таблицы входных данных.
id_country <- id_country[!(id_country$code %in% duplicates & id_country$country == "OTHER"),]
Почему?
id_country$code %in% duplicates
> id_country$code %in% duplicates
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
>
Мы можем исправить дефект, возвращая вектор вместо таблицы данных из строки кода, которая делает присвоение duplicates
, следующим образом.
if (length(unique(id_country$code)) != length(unique(id_country))){
# extract first column of resulting data.table as a vector
duplicates <- id_country[duplicated(code),][[1]]
# subset out duplicate rows named OTHER
id_country <- id_country[!(id_country$code %in% duplicates & id_country$country == "OTHER"),]
}
id_country
... и вывод:
> id_country
code country
1: 104 GERMANY
2: 105 IRLAND
3: 106 FRANCE
4: 109 FRANCE
5: 112 ITALY
6: 115 LUXEMBURG
>