2016-04-01 2 views
1

Say У меня есть dataframe, df, с тремя векторами:R - Удалить комбинации переменных, которые происходят несколько раз в data.frame

colours individual value 
1 white individual 1 0.4 
2 white individual 1 0.7 
3 black individual 2 1.1 
4 black individual 3 0.5 

Иногда же человек показывает вверх несколько раз для тех же цветов но разные значения. Я хотел бы написать код, который удалит все экземпляры, в которых это происходит.

*** EDIT: Есть много других строк, чем 4 миллиона - я не думаю, что текущие решения работают.

Я хотел бы подсчитать, сколько раз строка, которую я сейчас нахожу, в цикле for for, появляется, а затем удаляет их из data.frame. Таким образом, в приведенном выше примере я хотел бы избавиться от индивидуального 1. Затем df оставил остальные две строки.

До сих пор мой подход был такой:

  1. Получить список всех цветов

  2. Получить список всех лиц

  3. Напишите два для петель.

    colours <- unique(df$colours) ind <- unique(df$individual) for (i in ind) { for (c in colour) { #something here. Probably if, asking if the person I'm on in the loop #is found with the colour I am on, more than once, get rid of them } }

Мой ожидаемый результат заключается в следующем:

colours individual value 

black individual 2 1.1 

black individual 3 0.5 

Исходные данные

df <- data.frame(colours = c("white", "white", "black", "black"), 
       individual = c("individual 1", "individual 1", "individual 2", "individual 3"), 
       value = c(0.4, 0.7, 1.1, 0.5)) 
+0

Можете ли вы обновить ожидаемый результат – akrun

+0

Спасибо за предложение, mtoto. Это будет работать, за исключением другого вектора со значениями, которые отличаются друг от друга. Я не могу определить, какое значение является правильным, поэтому я пытаюсь просто удалить, где я нахожу два значения для одного и того же человека для одного и того же цвета. Я отредактирую это на вопрос, поскольку я только что заметил, как это усложняет ситуацию. – Gotmadstacks

+0

Может ли кто-нибудь отменить это как дубликат? Это не. Строки разные. Я изменил вопрос, чтобы отразить это. Извините за предыдущую путаницу. – Gotmadstacks

ответ

0

На основе некоторых предложений в комментариях, этот ответ сработал лучше всего:

df[!(duplicated(df[,1:2]) | duplicated(df[,1:2], fromLast = TRUE)), ]

Немного отличается от комментариев. Это указывает столбцы, а не строки, и поэтому достигает результата, который я хотел от вопроса (удалите те строки, где дублируются отдельные и цветные). Более полезно, потому что примерные данные в вопросе всего четыре строки, а не миллионы.

4

Вы можете попробовать с anti_join() из dplyr библиотеки:

library(dplyr) 
anti_join(df1, df1[duplicated(df1[1:2]),], by="individual") 
# colours individual value 
#1 black individual 3 0.5 
#2 black individual 2 1.1 
+0

Привет, Это не только избавит вас от первых двух строк? Я предполагаю, что, чтобы заставить его перебирать все строки, которые мне нужно изменить, поэтому я избавляюсь от него, применяя только к первым двум столбцам? – Gotmadstacks

+0

@Gotmadstacks Он должен исключить любую строку в data.frame, которая имеет комбинацию записей в столбцах один и два, встречающихся более одного раза. – RHertel

0

Это должно быть сделано. Я создал образец набора данных, добавленный индексный вектор, чтобы показать, что вы сохраняете только первое появление цветного пользователя. Это работает, ваши имена ростов являются фактическим номером строки.

## Data preparation 
colours <- sample(c("red","blue","green","yellow"), size = 50, replace = T) 
users <- sample(1:10, size=50, replace=T) 
df <- data.frame(colours,users) 
df$value <- runif(50) 
df$index <- 1:50 

## Keep only the first occurence 
res <- unique(df[,1:2]) 
res$values <- df$value[as.integer(rownames(res))] 
1

Вот еще один вариант с использованием data.table

library(data.table) 
setDT(df1)[, if(.N==1) .SD , .(colours, individual)] 
# colours individual value 
#1: black individual 2 1.1 
#2: black individual 3 0.5 
0

простого dplyr подхода будет заключаться в группу по желанию и фильтром для групп с менее чем 2 наблюдениями:

library(dplyr) 
df %>% 
    group_by(colours, individual) %>% 
    filter(n() < 2) 

Source: local data frame [2 x 3] 
Groups: colours, individual [2] 

    colours individual value 
    (fctr)  (fctr) (dbl) 
1 black individual 2 1.1 
2 black individual 3 0.5 
Смежные вопросы