Удалить дубликаты наблюдений между столбцами определенной строки - PullRequest
0 голосов
/ 03 января 2019

Это краткий пример кадра данных, который я пытаюсь очистить:

L3 <- LETTERS[1:5]    
fac<-c("fish", "meat", "chicken", "veg", "shrimp")

set.seed(1)
(d <- data.frame(code = sample(c(11:15)), 
      upc = sample(c(1:5)), desc = sample(fac), 
      desc1 = fac, desc2 = sample(fac), 
      desc3 = fac, desc4 = sample(fac) ))


  code upc    desc   desc1   desc2   desc3   desc4
1   12   5    meat    fish chicken    fish  shrimp
2   15   4    fish    meat  shrimp    meat    fish
3   14   2 chicken chicken     veg chicken    meat
4   13   3     veg     veg    fish     veg     veg
5   11   1  shrimp  shrimp    meat  shrimp chicken

Я пытаюсь написать функцию general (используя for loop и unique()), который проверяет записи из столбцов с 3 по 7 независимо для каждой строки и сохраняет уникальное значение, которое не повторяется в других столбцах (то есть: если строка содержит рыбу во всех столбцах desc, новая строка должна содержать рыбу только в одномколонка).Более конкретно, желаемый результат:

  code upc    desc desc1   desc2 desc3   desc4
1   12   5    meat  fish chicken        shrimp
2   15   4    fish  meat  shrimp              
3   14   2 chicken           veg          meat
4   13   3     veg          fish              
5   11   1  shrimp          meat       chicken

1 Ответ

0 голосов
/ 03 января 2019

Мы можем использовать duplicated, чтобы присвоить тем элементам, которые являются дубликатами в каждой строке, пустое значение "" для столбцов 'desc'

nm1 <- grep('desc', names(d))
d[nm1] <- t(apply(d[nm1], 1, function(x) {replace(x, duplicated(x), "")}))
d
#  code upc    desc desc1   desc2 desc3   desc4
#1   12   5    meat  fish chicken        shrimp
#2   15   4    fish  meat  shrimp              
#3   14   2 chicken           veg          meat
#4   13   3     veg          fish              
#5   11   1  shrimp          meat       chicken

Или с помощью цикла for (при условии, что столбцы имеют класс character или в качестве одного из уровней указаны пустые значения перед выполнением назначения)

for(i in seq_len(nrow(d))) d[i, nm1] <- replace(d[i, nm1], 
                                     duplicated(unlist(d[i, nm1])), '')
...