2016-03-23 2 views
2

У меня есть data.frame в R, который выглядит следующим образом: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 колонки, но ТОЛЬКО если одна строка имеет «Т», а другая имеет «N» в столбце TN.

Я играл с дублированным, но это не работает так, как я закодировал:

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 выше, я хочу удалить все из них, потому что по крайней мере один является «Т», а один - «N» в столбце TN.

Вот результат я хочу

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

Я нашел много вопросов о дублированных строк и удаление строк на основе нескольких столбцов. Но я не видел того, что делал что-то подобное.

+1

ли вопросы порядка? Или вы просто хотите удалить строки, которые имеют более одного уникального значения? Другими словами, будет ли это работать? 'with (inputtable, ave (as.integer (TN), Value, FUN = function (x) length (unique (x)))) <2' Или' table (unique (inputtable) $ Value) [as.character (inputtable $ Value)] <2'? –

+0

Ваш оператор 'with' работает точно так, как мне это нужно. Можете ли вы создать ответ и объяснить, как вы применяете команду 'ave' к этому? Спасибо! Я реализовал это с помощью: 'outputtable <- inputtable [с (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' for? И этот код отвечает только. –

+0

@DavidArenburg Это не нужно и может быть удален :-) – DatamineR

Смежные вопросы