2015-07-27 3 views
-2

У меня есть кадр данных с 309 888 наблюдениями и 121 переменным. Я хотел бы удалить экземпляры, где дублика дублируется.Удаление дубликатов в наборах диадических данных (R)

данных

D1 <- data.frame(row = c(1, 2, 3, 4, 5, 6, 7 , 8), 
      country = c("China", "China", "China", "China", "Myanmar", "Myanmar", "Myanmar", "Myanmar"), 
      year = c(1990, 1990, 1990, 1991, 1990, 1990, 1990, 1991), 
      group_a = c("Tibetan", "Tibetan", "Han", "Tibetan", "Karens", "Bamar", "Bamar", "Bamar"), 
      group_b = c("Han", "Manchu", "Tibetan", "Han", "Bamar", "Shan", "Karens", "Karens"), 
      var1= c(0, 0, 0, 0, 0, 0, 0, 0), 
        var2 = c(0, 0, 0, 0, 0, 0, 0, 0)) 

выглядит

row country year group_a group_b var1 var2 
1 1 China 1990 Tibetan  Han 0 0 
2 2 China 1990 Tibetan Manchu 0 0 
3 3 China 1990  Han Tibetan 0 0 
4 4 China 1991 Tibetan  Han 0 0 
5 5 Myanmar 1990 Karens Bamar 0 0 
6 6 Myanmar 1990 Bamar Shan 0 0 
7 7 Myanmar 1990 Bamar Karens 0 0 
8 8 Myanmar 1991 Bamar Karens 0 0 

В этой таблице, я хотел бы удалить строку 3 и строку 7 в комбинации столбцов 'group_a' и «группы b 'в строке 3 идентичны строке 1, то же самое относится к ряду 7 и строке 5.

Нужные Выходные

row country year group_a group_b var1 var2 
1 1 China 1990 Tibetan  Han 0 0 
2 2 China 1990 Tibetan Manchu 0 0 
4 4 China 1991 Tibetan  Han 0 0 
5 5 Myanmar 1990 Karens Bamar 0 0 
6 6 Myanmar 1990 Bamar Shan 0 0 
8 8 Myanmar 1991 Bamar Karens 0 0 

Любые предложения о том, как это сделать?

+3

Фотографии данных не воспроизводятся. Используйте результат из 'dput()' –

+0

Спасибо, Ричард. Я не совсем уверен, что это то, что вы имели в виду, я включил код в свой вопрос. – rbeginner

ответ

1

Вы могли бы сделать это

Использование dplyr

library(dplyr) 

D1[,c("group_a", "group_b")] = lapply(D1[,c("group_a", "group_b")], as.character) 

D1 %>% 
    rowwise() %>% 
    mutate(tmp = paste(sort(c(group_a,group_b)), collapse = '')) %>% 
     group_by(country, year) %>% 
     distinct(tmp) %>% 
     select(-tmp) 

#Source: local data frame [6 x 7] 
#Groups: country, year 

# row country year group_a group_b var1 var2 
#1 1 China 1990 Tibetan  Han 0 0 
#2 2 China 1990 Tibetan Manchu 0 0 
#3 4 China 1991 Tibetan  Han 0 0 
#4 5 Myanmar 1990 Karens Bamar 0 0 
#5 6 Myanmar 1990 Bamar Shan 0 0 
#6 8 Myanmar 1991 Bamar Karens 0 0 

Использование data.table

library(data.table) 
setDT(D1)[, c("group_a", "group_b") := lapply(.SD, as.character), 
          .SDcols = c('group_a', 'group_b')] 

out = unique(D1[,tmp := paste(sort(c(group_a,group_b)), collapse = ''), 
          by = row], by = c("tmp", "country", "year")) 
out[,!"tmp", with = FALSE] 

# row country year group_a group_b var1 var2 
#1: 1 China 1990 Tibetan  Han 0 0 
#2: 2 China 1990 Tibetan Manchu 0 0 
#3: 4 China 1991 Tibetan  Han 0 0 
#4: 5 Myanmar 1990 Karens Bamar 0 0 
#5: 6 Myanmar 1990 Bamar Shan 0 0 
#6: 8 Myanmar 1991 Bamar Karens 0 0 

база R альтернативы использования * Применение функции

D1[,c("group_a", "group_b")] = lapply(D1[,c("group_a", "group_b")], as.character) 

D1$tmp = apply(D1[,c("group_a","group_b")], 1, 
     function(x) paste(sort(c(x[1], x[2])), collapse = "")) 

do.call(rbind, lapply(split(D1, list(D1$country, D1$year)), 
     function(x){ out = x[!duplicated(x$tmp),]; out[,-8]})) 
+0

Спасибо, Veerendra. Однако при вводе кода я получаю следующую ошибку при запуске первой строки: Ошибка в применении (SOSdyad.country [, 4:46], 1, функция (x) paste (sort (c (x [1] ,: dim (X) должен иметь положительную длину – rbeginner

+0

да, потому что вы указали неверный указатель внутри страны, почему вы пишете 4:46? И для ваших данных примера он отлично работает –

+0

oh, потому что в фактическом наборе данных первая группа находится в четвертом столбце, а вторая - в 46-м столбце. Должен ли я сделать это по-другому? – rbeginner

1

использованием data.table:

library(data.table) 
setDT(D1) 
setkey(D1,row) 
D1[D1[, list(country,year,min(group_a,group_b),max(group_a,group_b)), by = row][, list(row = min(row)), by = c("country","year","V3","V4")][, row]] 

Для факторов, вы можете изменить тип назад и вперед (смотреть на as.character) или настроить вызов:

D1[D1[, list(country,year,min(as.character(group_a),as.character(group_b)),max(as.character(group_a),as.character(group_b))), by = row][, list(row = min(row)), by = c("country","year","V3","V4")][, row]] 
+0

Благодарим вас за ответ и за редактирование вопроса, чтобы он стал понятнее. Однако я не могу заставить код работать. Когда я набираю «setDT (D1, row)»; Я получаю следующую ошибку: Ошибка в setkeyv (x, cols, verbose = verbose, physical = physical): Некоторые столбцы не находятся в таблице данных. Table: строка – rbeginner

+0

@rbeginner в вашем примере, у вас был столбец с именем row. Это не так в вашем фактическом наборе данных? – Chris

+0

Большое вам спасибо за указание на это, Крис. Эта строка работает отлично, но когда я печатаю в последней строке, я получаю эту ошибку: Ошибка в Summary.factor (592L, 237L, na.rm = FALSE): 'min' не имеет смысла для факторов – rbeginner

Смежные вопросы