2015-05-21 2 views
4

У меня есть огромные наборы данных, которые содержат более миллиона строк и имеют некоторые специфические атрибуты. Мне нужно отфильтровать данные, сохраняя другие свойства.Как фильтровать данные в R?

Мои данные, как, как следующее:

 ID Prop1 Prop2 TotalProp 
56891940  G02  G02   2 
56892558  A61  G02   4 
56892558  A61  A61   4 
56892558  G02  A61   4 
56892558  A61  A61   4 
56892552  B61  B61   3 
56892552  B61  B61   3 
56892552  B61  A61   3 
56892559  B61  G61   3 
56892559  B61  B61   3 
56892559  B61  B61   3 and so on more than million rows 

То, что я хочу, мне нужно, чтобы удалить строки, если все строки ID, имеющие 56891940 и 56892559, которые имеют «prop1» и «prop2» же, но не 56892558 и 56892559, потому что некоторые строки одинаковы, но по крайней мере одно из его свойств отличается, поэтому я хочу сохранить все значения от 56892558,56892552 и 56892559 и так далее.

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

 ID Prop1 Prop2 TotalProp 
56892558  A61  G02   4 
56892558  A61  A61   4 
56892558  G02  A61   4 
56892558  A61  A61   4 
56892552  B61  B61   3 
56892552  B61  B61   3 
56892552  B61  A61   3  
56892559  B61  G61   3 
56892559  B61  C61   3 
56892559  B61  B61   3 
+1

При написании или редактировании вопрос, хороший способ прокладки кода или данных доступна, как описано здесь: http://stackoverflow.com/help/formatting – Frank

+0

Пожалуйста, ознакомьтесь с обновленным решением – akrun

+1

Большое спасибо, я очень благодарен за ваш быстрый и отличный ответ! Ура! – Sudas

ответ

4

Вы можете попробовать

library(data.table) 
setDT(df1)[, .SD[any(Prop1!=Prop2)], ID] 
#   ID Prop1 Prop2 TotalProp 
# 1: 56892558 A61 G02   4 
# 2: 56892558 A61 A61   4 
# 3: 56892558 G02 A61   4 
# 4: 56892558 A61 A61   4 
# 5: 56892552 B61 B61   3 
# 6: 56892552 B61 B61   3 
# 7: 56892552 B61 A61   3 
# 8: 56892559 B61 G61   3 
# 9: 56892559 B61 B61   3 
#10: 56892559 B61 B61   3 

Или, как @Frank предложил

setDT(df1)[, if(any(Prop1!=Prop2)) .SD, ID] 

Похожие вариант с использованием dplyr

library(dplyr) 
df1 %>% 
    group_by(ID) %>% 
    filter(any(Prop1!=Prop2)) 

Или с помощью ave из base R

df1[with(df1, ave(Prop1!=Prop2, ID, FUN=any)),] 
+1

Спасибо! это сработало! – Sudas

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