Удалить дубликаты на основе некоторых условий - PullRequest
0 голосов
/ 17 марта 2020

У меня есть два набора данных: D 1 и D 2 . D 2 - это левое соединение с D 1 и большим набором данных, который я назову D 3 . Хотя ключевой столбец D 2 содержит то же количество уникальных элементов, что и D 1 , в нем есть некоторые дубликаты, от которых я хочу избавиться в зависимости от определенных условий.

Есть две проблемы:

1) Есть несколько строк, полных значений NA, за исключением значения ключа, и эти строки очень важны для меня.

2) Существуют некоторые другие строки, которые могут или не могут быть дублированы, но не соответствуют моим стандартным условиям.

Как я могу удалить эти дубликаты условно на основе иерархии?

Образец набора данных:

ID  Var
1   1
2   1
3   1
3   9
4   2
4   9
5   1
6   1
7   1
7   9
7   9
8   2
9  
10  1

Ожидаемый набор данных:

ID  Var
1   1
2   1
3   1
4   2
5   1
6   1
7   1
8   2
9  
10  1

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

Скажем так! У нас есть таблица данных ниже:

Library(data.table)
 df <- data.table(Name = c("JACK", "JOHN", "JACK", "ANNIE", "JOHN", "JACK"), 
                  Amount = c(30, 10, 20, 24, 5, 1))

В этом случае я упорядочиваю по имени, поэтому он будет аналогичен столбцу вашего идентификатора. Когда я получу соответствующий заказ, я возьму только первый результат

df[][order(Name, Amount)]
df[,.SD[1], by = Name]

Вывод:

    Name Amount
1:  JACK     30
2:  JOHN     10
3: ANNIE     24

Надеюсь, это может вам помочь.

0 голосов
/ 17 марта 2020

duplicated делает то, что вам нужно.

dat[!duplicated(dat$ID),]
#    ID Var
# 1   1   1
# 2   2   1
# 3   3   1
# 5   4   2
# 7   5   1
# 8   6   1
# 9   7   1
# 12  8   2
# 13  9  NA
# 14 10   1

Как и что-то из тидиверса:

library(dplyr)
dat %>%
  group_by(ID) %>%
  slice(1) %>%
  ungroup()

И data.table ...

library(data.table)
as.data.table(dat)[ !duplicated(ID), ]

Данные:

dat <- read.table(header = TRUE, text = "
ID  Var
1   1
2   1
3   1
3   9
4   2
4   9
5   1
6   1
7   1
7   9
7   9
8   2
9   NA
10  1")
...