2011-08-18 56 views
16

特定行我有一個數據幀例如爲:卸下從數據幀

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 ='1'和day ='2',sub = 3和day ='4'的行。我怎麼能這樣做? 我意識到我可以指定行號,但是這需要應用於一個巨大的數據框,這將是繁瑣的通過和ID每行。

回答

27
DF[ ! ((DF$sub ==1 & DF$day==2) | (DF$sub ==3 & DF$day==4)) , ] # note the ! (negation) 

或者,如果子是您使用報價建議的因素:

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

也可以使用子集:(使用「[」儘管有些人聲稱不需要它的時候,我贊同在德克的回答使用which

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

+0

那就是票。謝謝。 %的百分比是什麼意思? –

+2

這是一箇中綴運算符的示例,它返回一個邏輯向量,告訴您第一個參數中的哪些元素包含在第二個參數中。請參閱?符合其定義的位置。 –

+0

@BonddedDust以及 – 2015-03-24 19:38:45

16

這可以歸結爲兩個不同的步驟:

  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> 
+0

好吧,我認爲這將有一些額外的工作有所幫助......我需要身份證entify多天,所以我試着對你的代碼稍加修改:ind <-which(with(Licor,day = c('1','16','30','37','51','52','57 ','58'))),但會收到錯誤消息。有任何想法嗎? –

+0

處理表達式來計算indies,你可能會發現'help(match)'有用。 –

+0

這個答案通過例子解釋了所需的策略,如何應用代碼以及應用哪些代碼。這很有幫助。 – Irwin

4

下面是一個解決您的問題使用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 
2

一個簡單的解決方案

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

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

df <- df[!cond1,]

df <- df[!cond2,]