2015-04-30 113 views
2

所以我們有這樣的基本數據子集與R中dplyr或其他包

A <- c(1,1,1,2,2,2,3,3,3) 
B <- c(1,0,0,1,0,0,1,0,0) 
C <- c(2,2,3,4,3,3,3,4,3) 
Data <- data.frame(A,B,C) 

而我們現在要對其進行過濾,從而

我們看看每一種情況下,其中C = 3,B = 1 並使用此值找到它的值 ,我們要搜索C = 4和B = 0,並刪除它

所以圖形,

enter image description here

我們要刪除的紅色行,並保持綠色的

我非常想使用dplyr,但我願意將其他選擇

+4

鑑於你剛纔有一個關於使用dplyr進行篩選的問題,你對這個問題有什麼想法? http://stackoverflow.com/questions/29963150/filter-a-specific-case-using-dplyr –

+0

奇怪的問題:你爲什麼要刪除'C == 4'和'B == 0'的行並且不是另一個'A'值是'3'的嗎? –

+1

我試圖使用類似於: data2 <- Data %>% group_by(B)%>% filter(!(C [B == 1&C = 3] = 4)) – lukeg

回答

4

基礎R,我想這是你所需要的:

# Column A values to consider for filter 
C3_B1 <- Data[Data$C==3 & Data$B==1,"A"] 

# Filter out rows where C==4 and B==0 
Data[ !(Data$A %in% C3_B1 & 
      Data$C==4 & 
      Data$B==0),] 

# Output - row 8 is removed 
# A B C 
# 1 1 1 2 
# 2 1 0 2 
# 3 1 0 3 
# 4 2 1 4 
# 5 2 0 3 
# 6 2 0 3 
# 7 3 1 3 
# 9 3 0 3 

使用sqldf包:

sqldf(c("DELETE FROM Data 
      WHERE A IN (SELECT A FROM Data 
         WHERE C = 3 AND B = 1) 
       AND C = 4 
       AND B = 0", 
     "SELECT * FROM Data ")) 
1

你提到的其他替代品,所以這裏是data.table

library(data.table) 
d=as.data.table(Data) 
d[!((A==d[B==1 & C==3,A])&(C==4&B==0))] 

但不知道這將如何工作在一個更復雜的案件與更多的行刪除。

2

隨着dplyr

Data %>% filter(!(A==select(filter(Data, C==3 & B==1), A)[,1] & C==4 & B ==0)) 

其過程分爲兩個步驟在本質上。

的第一個是:

select(filter(Data, C==3 & B==1), A) 

過濾Data其中C==3B==1然後僅選擇列A。讓我們命名爲temp

的第二步驟是:

Data %>% filter(!(A==temp[,1] & C==4 & B ==0)) 

一個簡單的濾波。

0

另一種解決方案,可能比上面的一些慢。但讀者可能會更加透明。也更容易投入到一個功能,如果你想運行B和C.

a_values <- Data %>% 
    filter(B == 1, C == 3) %>% 
    select(A) %>% 
    unique() 

Data <- Data %>% 
    filter(!(A %in% a_values & B == 0 & C == 4)) 

編輯的不同值:忘了否定!

2

這是另一種data.table方法。首先,將其讀取到鍵控數據。表:

require(data.table) 
DT <- data.table(Data,key="C,B,A") 

識別值的OP不喜歡

myA <- DT[J(3,1)]$A 

排除

DT[!J(4,0,myA)] 

這也將工作,如果myA是一個載體。