Стереть повторяющиеся строки в r с условным столбцом - PullRequest
1 голос
/ 13 февраля 2020

У меня есть эти данные: https://pastebin.com/x8HrT8qK

"sp";"mes";"ano";"code"
"56";"CM";7;2016;"CM52"
"57";"CM";2;2019;"CM52"
"58";"CM";11;2016;"CM53"
"59";"CM";9;2019;"CM53"
"60";"CM";5;2018;"CM53"
"61";"CM";5;2018;"CM53"
"374";"EI";8;2019;"EI26"
"375";"EI";8;2019;"EI26"
"376";"EI";3;2019;"EI26"
"377";"EI";7;2019;"EI26"
"378";"EI";11;2019;"EI26"
"379";"EI";2;2020;"EI26"
"380";"EI";10;2019;"EI27"
"381";"EI";11;2019;"EI27"
"382";"EI";11;2019;"EI27"

, и я хотел бы исключить строки, имеющие один и тот же "код", только если они имеют одинаковое "ano"

Чтобы данные выглядели так: https://pastebin.com/F7tkUZE1

"sp";"mes";"ano";"code"
"56";"CM";7;2016;"CM52"
"57";"CM";2;2019;"CM52"
"58";"CM";11;2016;"CM53"
"59";"CM";9;2019;"CM53"
"60";"CM";5;2018;"CM53"
"374";"EI";8;2019;"EI26"
"379";"EI";2;2020;"EI26"
"380";"EI";10;2019;"EI27"

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Мы можем использовать duplicated для создания логического индекса дубликатов элементов, а затем удалить строки на основе индекса. Использование base R (без каких-либо внешних пакетов)

df1[ !duplicated(df1[c('ano', 'code')]),]
#    sp mes  ano code
#56  CM   7 2016 CM52
#57  CM   2 2019 CM52
#58  CM  11 2016 CM53
#59  CM   9 2019 CM53
#60  CM   5 2018 CM53
#374 EI   8 2019 EI26
#379 EI   2 2020 EI26
#380 EI  10 2019 EI27

data

df1 <- read.csv('file.csv', sep=";")   


df1 <- structure(list(sp = c("CM", "CM", "CM", "CM", "CM", "CM", "EI", 
"EI", "EI", "EI", "EI", "EI", "EI", "EI", "EI"), mes = c(7L, 
2L, 11L, 9L, 5L, 5L, 8L, 8L, 3L, 7L, 11L, 2L, 10L, 11L, 11L), 
    ano = c(2016L, 2019L, 2016L, 2019L, 2018L, 2018L, 2019L, 
    2019L, 2019L, 2019L, 2019L, 2020L, 2019L, 2019L, 2019L), 
    code = c("CM52", "CM52", "CM53", "CM53", "CM53", "CM53", 
    "EI26", "EI26", "EI26", "EI26", "EI26", "EI26", "EI27", "EI27", 
    "EI27")), class = "data.frame", row.names = c("56", "57", 
"58", "59", "60", "61", "374", "375", "376", "377", "378", "379", 
"380", "381", "382"))
2 голосов
/ 13 февраля 2020

Здесь я приведу неосновное решение. distinct в dplyr можно выбрать уникальные строки из фрейма данных.

dplyr::distinct(df, ano, code, .keep_all = T)

#   sp mes  ano code
# 1 CM   7 2016 CM52
# 2 CM   2 2019 CM52
# 3 CM  11 2016 CM53
# 4 CM   9 2019 CM53
# 5 CM   5 2018 CM53
# 6 EI   8 2019 EI26
# 7 EI   2 2020 EI26
# 8 EI  10 2019 EI27
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...