Удаление определенных строк из кадра данных - PullRequest
24 голосов
/ 18 августа 2011

У меня есть фрейм данных, например:

sub   day
1      1
1      2
1      3
1      4
2      1
2      2
2      3
2      4
3      1
3      2
3      3
3      4

, и я хотел бы удалить определенные строки, которые могут быть идентифицированы комбинацией sub и day.Например, я хочу удалить строки, где sub = '1' и day = '2', sub = 3 и day = '4'.Как я мог это сделать?Я понимаю, что могу указать номера строк, но это необходимо применить к огромному кадру данных, который было бы утомительно просматривать и идентифицировать каждую строку.

Ответы [ 4 ]

35 голосов
/ 18 августа 2011
DF[ ! ( ( DF$sub ==1 & DF$day==2) | ( DF$sub ==3 & DF$day==4) ) , ]   # note the ! (negation)

Или, если sub является фактором, как предполагается при использовании кавычек:

DF[ ! paste(sub,day,sep="_") %in% c("1_2", "3_4"), ]

Можно также использовать подмножество:

subset(DF,  ! paste(sub,day,sep="_") %in% c("1_2", "3_4") )

(И я поддерживаю использование which в ответе Дирка при использовании «[», хотя некоторые утверждают, что это не нужно.)

16 голосов
/ 18 августа 2011

Это сводится к двум отдельным шагам:

  1. Выясните, когда ваше условие истинно, и, следовательно, вычислите вектор логических значений или, как я предпочитаю, их индексы, обернув его в which()
  2. Создайте обновленный data.frame, исключив индексы из предыдущего шага.

Вот пример:

R> set.seed(42)
R> DF <- data.frame(sub=rep(1:4, each=4), day=sample(1:4, 16, replace=TRUE))
R> DF
   sub day
1    1   4
2    1   4
3    1   2
4    1   4
5    2   3
6    2   3
7    2   3
8    2   1
9    3   3
10   3   3
11   3   2
12   3   3
13   4   4
14   4   2
15   4   2
16   4   4
R> ind <- which(with( DF, sub==2 & day==3 ))
R> ind
[1] 5 6 7
R> DF <- DF[ -ind, ]
R> table(DF)
   day
sub 1 2 3 4
  1 0 1 0 3
  2 1 0 0 0
  3 0 1 3 0
  4 0 2 0 2
R> 

И мы видим, что у sub==2 остается только одна запись с day==1.

Редактировать Составное условие можно выполнить с помощью 'или' следующим образом:

ind <- which(with( DF, (sub==1 & day==2) | (sub=3 & day=4) ))

и вот новый полный пример

R> set.seed(1)
R> DF <- data.frame(sub=rep(1:4, each=5), day=sample(1:4, 20, replace=TRUE))
R> table(DF)
   day
sub 1 2 3 4
  1 1 2 1 1
  2 1 0 2 2
  3 2 1 1 1
  4 0 2 1 2
R> ind <- which(with( DF, (sub==1 & day==2) | (sub==3 & day==4) ))
R> ind
[1]  1  2 15
R> DF <- DF[-ind, ]
R> table(DF)
   day
sub 1 2 3 4
  1 1 0 1 1
  2 1 0 2 2
  3 2 1 1 0
  4 0 2 1 2
R> 
9 голосов
/ 09 августа 2015

Вот решение вашей проблемы с использованием функции dplyr filter.

Хотя вы можете передать свой фрейм данных в качестве первого аргумента любой функции dplyr, я использовалоператор %>%, который направляет ваш фрейм данных к одной или нескольким функциям dplyr (в данном случае просто отфильтруйте).

Если вы немного знакомы с dplyr, шпаргалка оченьудобно.

> print(df <- data.frame(sub=rep(1:3, each=4), day=1:4))
   sub day
1    1   1
2    1   2
3    1   3
4    1   4
5    2   1
6    2   2
7    2   3
8    2   4
9    3   1
10   3   2
11   3   3
12   3   4
> print(df <- df %>% filter(!((sub==1 & day==2) | (sub==3 & day==4))))
   sub day
1    1   1
2    1   3
3    1   4
4    2   1
5    2   2
6    2   3
7    2   4
8    3   1
9    3   2
10   3   3
2 голосов
/ 13 марта 2016

одно простое решение

cond1 <- df$sub == 1 & df$day == 2

cond2 <- df$sub == 3 & df$day == 4

df <- df[!cond1,]

df <- df[!cond2,]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...