从数据框中删除特定行

时间:2011-08-18 19:16:39

标签: r dataframe rows

我有一个数据框,例如:

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 个答案:

答案 0 :(得分:35)

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") )

(我赞同在使用“[”时在Dirk的回答中使用which,即使有些人声称不需要它。)

答案 1 :(得分:16)

这归结为两个不同的步骤:

  1. 弄清楚你的情况何时为真,因此计算一个布尔值的向量,或者,我喜欢把它们的索引包装成which()
  2. 通过排除上一步中的索引来创建更新的data.frame
  3. 以下是一个例子:

    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> 
    

答案 2 :(得分:9)

以下是使用dplyrfilter函数解决问题的方法。

虽然您可以将数据帧作为第一个参数传递给任何dplyr函数,但我使用了它的%>%运算符,它将数据帧传递给一个或多个dplyr函数(在这种情况下只是过滤器)。

一旦你对dplyr有点熟悉,cheat sheet非常方便。

> 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

答案 3 :(得分:2)

一个简单的解决方案

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

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

df <- df[!cond1,]

df <- df[!cond2,]

相关问题