2013-07-03 2 views
-1

У меня есть кадр данных два столбца в R, скажем, это как следующийузнать данные, которые не соответствуют

V1 V2 
1 2 
2 4 
1 2 
2 3 
1 2 
... 

Если значение V1 появляется более чем один раз, и если эти линии, имеющие общие Значение V1 имеет разные значения V2, отфильтровывайте их.

Как я могу сделать это эффективно в R? Я думаю, мне нужно использовать некоторые хэш-функции, не так ли? Но я не уверен, как это сделать.

спасибо.

+2

показать нам свой код и ожидаемый результат! – Metrics

ответ

1

1) Попробуйте это:

DF <- data.frame(V1 = c(1L, 2L, 1L, 2L, 1L), V2 = c(2L, 4L, 2L, 3L, 2L)) 

is.ok <- function(x) var(range(x)) == 0 
subset(DF, ave(V2, V1, FUN = is.ok) == 1) 

Результат последней строки:

V1 V2 
1 1 2 
3 1 2 
5 1 2 

Чтобы получить противоречивые данные, а не последовательные данные, то изменить == 1 к == 0 в последняя строка кода.

2) Если вы предпочитаете не показывать дубликаты, то это показывает последовательные строки, но без дубликатов:

subset(unique(DF), ave(V2, V1, FUN = length) == 1) 

Это дает:

V1 V2 
1 1 2 

Изменить == 1 в > 1 в коде вместо показать несогласованные строки, опуская дубликаты.

0

Использование неопределенных местоимений в спецификации проблемы подвержено неверному истолкованию. Я показываю код, который интерпретирует «их» как «все экземпляры строк, где значение V1 связано с более чем одним значением V2», и где «фильтр» интуитивно понятен, как передает их в data.frame для проверки.

more.than.one.V2 <- dfrm[ave(dfrm$V2, dfrm$V1, 
          FUN=function(x){length(unique(x))!=1}), ] 
    only.one.V2 <- dfrm[ave(dfrm$V2, dfrm$V1, 
          FUN=function(x){length(unique(x))==1}), ] 
Смежные вопросы