2014-04-10 2 views
1

Я думал эту проблему на всю ночь: вот моя матрица:R, находить дублирующиеся строки, независимо от того,

'a' '#' 3 
'#' 'a' 3 
0 'I am' 2 
'I am' 0 2 

.....

Я хочу лечить строки, подобные первым двум строкам, одинаковы, потому что это просто другой порядок «a» и «#». В моем случае я хочу удалить такие строки. Пример игрушки простой, первые два одинаковы, третий и четвертый одинаковые. но в моем наборе данных я не знаю, где «такая же» строка.

Я пишу в R. Спасибо.

+1

Вы хотите удалить оба дубликата или только один? – CCurtis

+1

Какой выход вы хотите получить? 'F T F T' или' T T T T'? ('F'-not dup,' T'-dup) – bartektartanus

+0

Я думаю, что это довольно близко, но я получаю сообщение об ошибке. Странно, потому что он работает, если вы вручную указываете i и n, но когда я позволяю повторять и контролировать их, он выходит из строя. Он должен обозначать все повторяющиеся строки NA. то вы можете просто удалить их 'for (i в 1: length (df [, 1])) {x = (1: length (df [, 1])) x = x [! x == i] для (n в x) {if (sort (df [i,]) [1] == sort (df [n,]) [1] & sort (df [i,]) [2] == sort (df [n ,]) [2] & sort (df [i,]) [3] == sort (df [n,]) [3]) df [n, 1: 3] <- NA} } ' – CCurtis

ответ

3

Возможно, что-то подобное будет работать на вас. Неясно, каков ваш желаемый результат.

x <- structure(c("a", "#", "0", "I am", "#", "a", "I am", "0", "3", 
       "3", "2", "2"), .Dim = c(4L, 3L)) 
x 
#  [,1] [,2] [,3] 
# [1,] "a" "#" "3" 
# [2,] "#" "a" "3" 
# [3,] "0" "I am" "2" 
# [4,] "I am" "0" "2" 


duplicated(
    lapply(1:nrow(x), function(y){ 
    A <- x[y, ] 
    A[order(A)] 
    })) 
# [1] FALSE TRUE FALSE TRUE 

Это в основном разбивает матрицу по строкам, а затем сортирует каждую строку. duplicated работает также с list, поэтому вы просто обертываете все это «дублированием», чтобы найти, какие элементы (строки) дублируются.

+0

Спасибо за помощь. Но у меня что-то не так с моими тестовыми данными: /// x = матрица (c (0,3,2,3,0,1,2,1,0), 3,3) /// z = as.vector (х) /// Ind = г> = 1 /// у = с ('а', 'B', 'с') /// уу = expand.grid (у, у) //// YYY = cbind (уу, г) [Ind,] //// дублированы ( lapply (1: nrow (YYY), функция (у) { А <- YYY [y,] A [заказ (A)] })) /// [1] FALSE FALSE FALSE FALSE FALSE FALSE /// Я не знаю, как сделать код не отображающимся на той же линии. Сожалею. –

+0

Случилось и так! Причина в том, что у вас есть имена столбцов, назначенные в x. Вот что происходит: 'order (A)' упорядочивает строку аккуратно и возвращает упорядоченную версию строки с именами столбцов. Однако результирующий объект из 'lapply' уважает имена столбцов и передает' duplicated' версию, где имена столбцов не повреждены. Таким образом, то, что считается дублированным, такое же, как x! См. Мой ответ для решения. – agoldev

0

В начале, вы можете обратиться к to the documentation for an excellent R package called duplicated. Как отмечает пакет, «duplicated() определяет, какие элементы вектора или фрейма данных являются дубликатами элементов с меньшими индексами, и возвращает логический вектор, указывающий, какие элементы (строки) дублируются». Некоторые примеры, которые они обеспечивают, являются:

Пример 1:

duplicated(iris)[140:143] 

Пример 2:

duplicated(iris3, MARGIN = c(1, 3)) 

Пример3

anyDuplicated(iris) 

Пример 4

anyDuplicated(x) 

Пример 5

anyDuplicated(x, fromLast = TRUE) 

EDIT: Если вы хотите сделать это долгий путь, вы могли бы думать, сравнивать каждую строку с каждой другой строки в данных из характер по характеру. Для этого представьте, что первая строка имеет 3 символа. Для каждой строки вы выполняете цикл и проверяете, есть ли у них этот символ. Если они это сделают, вы затем уменьшите и проверите следующий символ. Приближаясь к этому, используя самосозданную рекурсивную функцию, которая сравнивает значение в строке со всеми другими строками в кадре данных или матрице (а затем подмножества ТОЛЬКО на строках, которые не соответствуют никаким другим строкам), может работать.

+0

'duplicated' действительно является правильной * функцией * (а не пакетом), но я не уверен, как это помогает OP достичь ответ. – A5C1D2H2I1M1N2O1R2T1

0

Для меня это также просто вектор FALSE, что означает, что он не обнаружил дубликатов. Я думаю, что это произошло: у меня были имена столбцов, назначенные в x. Таким образом, хотя order(A) упорядочивал строку аккуратно и возвращает упорядоченную версию строки с именами столбцов, результирующий объект из лапно относится к именам столбцов и передает до duplicated() версию, в которой столбцы остаются нетронутыми (из-за имен). Таким образом, то, что считается duplicated(), такое же, как x!

Я сделал это вдохновленный ответом @A Handcart И мохера, который работал для меня:

duplicated(t(apply(x, 1, sort))) 

Это тоже короче;)

Обратите внимание, что пример по @A Handcart и мохер работ с его образцовыми данными. Но если вы назвали столбцы, это терпит неудачу.

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