2016-10-29 5 views
0

У меня есть кадр данных:удалить некоторые строки в dataframe

mydata <- data.frame(
    x1= as.factor(1:3), 
    x2= as.factor (4:6), 
    x3= as.factor(7:9), 
    x4= as.factor (2:7), 
    x5= as.factor(1:6), 
    x6= seq(0,600,len= 600), 
    x7= seq(0,1,len=600) 
) 

И я хочу, чтобы удалить некоторые строки в этом с конкретными условиями. Я сделал это так:

mydata1 <- mydata%>% 
filter(x1==1, x2==4, x3==7, x4==2, x5==1)%>% 
anti_join(mydata,., by=c("x1", "x2", "x3", "x4","x5","x6" "x7")) 

mydata2 <- mydata1%>% 
filter(x1==3, x2==6 x3==9, x4==7, x5==6)%>% 
    anti_join(mydata1,., by=c("x1", "x2", "x3", "x4","x5","x6", "x7")) 

Есть много строк, которые я хочу удалить. Есть ли другой способ сделать это?

+0

Почему вы используете здесь факторы? Факторы с целыми уровнями, которые не соответствуют номерам уровней, кажутся рискованным и ненужным осложнением. – Gregor

+1

Базовая опция R - это 'mydata1 <- mydata [! As.character (взаимодействие (mydata [1: 5]))% в%" 1.4.7.2.1 ",]; mydata2 <- mydata1 [! As.character (взаимодействие (mydata1 [1: 5]))% в% "1.6.9.7.6",] ' – akrun

ответ

2

Вы можете комбинировать логические тесты с & для и и | для или. Если вы хотите удалить строки, которые соответствуют всем следующим

x1==1, x2==4, x3==7, x4==2, x5==1 

Тогда сделайте это так:

filter(mydata, !(x1 == 1 & x2 == 4 & x3 == 7 & x4 == 2 & x5 == 1)) 

Порядок строк отличается, но результат тот же:

md1 = filter(mydata, !(x1 == 1 & x2 == 4 & x3 == 7 & x4 == 2 & x5 == 1)) 
identical(arrange(md1, x6), arrange(mydata1, x6)) 
# [1] TRUE 

Вы можете комбинировать свои условия в одном filter следующим образом:

md2 = filter(
    mydata, 
    !(x1 == 1 & x2 == 4 & x3 == 7 & x4 == 2 & x5 == 1), 
    !(x1 == 3 & x2 == 6 & x3 == 9 & x4 == 7 & x5 == 6) 
) 
Смежные вопросы