2016-03-23 99 views
2

我R中,看起來像有data.frame基於重複和值的行如下:的R - 刪除另一列

> inputtable <- data.frame(TN = c("T","N","T","N","N","T","T","N"), 
+      Value = c(1,1,2,2,2,3,3,5)) 
> inputtable 
    TN Value 
1 T  1 
2 N  1 
3 T  2 
4 N  2 
5 N  2 
6 T  3 
7 T  3 
8 N  5 

我想刪除,在Value列重複值,但只如果在TN列中一行有「T」,另一行有「N」。

我重複發揮各地,但是,這並不工作,我已經編碼的方式:

TNoverlaps.duprem <- TNoverlaps[ !(duplicated(TNoverlaps$Barcode) & ("T" %in% TNoverlaps$TN & "N" %in% TNoverlaps$TN)), ] 

TNoverlaps.duprem <- TNoverlaps[ duplicated(TNoverlaps$Barcode) & !duplicated(TNoverlaps$Barcode, TNoverlaps$TN), ] 

如果有兩個以上的列,如行3-5以上,我想刪除所有這些,因爲在TN列中至少有一個是「T」,一個是「N」。

這裏的輸出我想

> outputtable 
    TN Value 
6 T  3 
7 T  3 
8 N  5 

我找到了很多關於重複行的問題,以及基於多列刪除行。但我沒有看到有人這樣做過。

+1

是否爲了事項?或者你只是想刪除有多個「唯一」值的行?換句話說,這會工作嗎? (inputtable,ave(as.integer(TN),Value,FUN = function(x)length(unique(x))))<2'或'table(unique(inputtable)$ Value)[as.character可輸入$ Value)] <2'? –

+0

您的'with'語句完全符合我的需求。你能否請你創建一個答案並解釋你如何應用這個'ave'命令?謝謝!我實現了這個:'outputtable < - inputtable [with(inputtable,ave(as.integer(TN),Value,FUN = function(x)length(unique(x)))<2,]' –

回答

2

你可以嘗試:

library(dplyr) 

inputtable %>% group_by(Value) %>% filter(!(n_distinct(TN) >= 2)) 
Source: local data frame [3 x 2] 
Groups: Value [2] 

     TN Value 
    (fctr) (dbl) 
1  T  3 
2  T  3 
3  N  5 
+1

什麼是'n()> = 2'爲?而這個代碼只能回答。 –

+0

@DavidArenburg這是不必要的,可以刪除:-) – DatamineR