2017-02-22 42 views
1

У меня есть список data.frames который выглядит следующим образом:Удалить конкретные дублированные наблюдения в data.frames из списка data.frames

$`42` 
    Val  Replicate Index  
    26.92  R2 42 
    26.92  R3 42 
    28.68  R1 42 
    28.68  R4 42 

$`43` 
    Val  Replicate Index 
    28.92  R3 43 
    29.28  R2 43 
    30.11  R1 43 
    30.11  R4 43 

$`44` 
    Val Replicate Index 
    24.67  R3 44 
    24.70  R2 44 
    25.70  R1 44 
    25.70  R4 44 

$`45` 
    Val Replicate Index 
    30.57  R1 45 
    30.57  R4 45 
    32.39  R2 45 
    32.81  R3 45 

То, что я хотел бы сделать это следующим образом: если в в столбце «Val» имеется дублированный элемент по отношению к R4 в столбце «Replicate», они оба будут удалены из столбца «Val».

Например, в data.frame с именем 45, так как 30.57 (R1) равно 30.57 (R4), оба они будут удалены, сохраняя только 32.39 (R2) и 32.81 (R3). Таким образом, желаемый результат для data.frame 45 будет:

$`45` 
    Val Replicate Index 
    32.39  R2 45 
    32.81  R3 45  

Я пытался использовать:

lapply(mydf, function(x) x[!duplicated(x[c("Val")]), ])  

, но, к сожалению, она удаляет все дублированные элементы в столбце «Вал», а не по отношению к сравнение с R4 в столбце «Репликация».

+0

Итак, это специфично для «R4» с любыми другими значениями? – akrun

+0

Точно! R4 является ссылкой для матча. – Bfu38

ответ

2

Если это относится только к значениям «R4», то

df[!((duplicated(df$Val) | duplicated(df$Val, fromLast=TRUE)) & 
    df$Val[df$Replicate == "R4"]), ] 

будет держать без повторяющихся наблюдений, а также всех не-R4 наблюдения для некоторых data.frame ФР. Затем, чтобы поставить это в lapply

mynonDupeList <- lapply(myList, 
        function(i) i[!((duplicated(df$Val) | duplicated(i$Val, fromLast=TRUE)) 
            & i$Val[i$Replicate == "R4"]), ])) 

должен сделать трюк.

+0

Он отлично работает! Большое спасибо! – Bfu38