R, найти повторяющиеся строки, независимо от порядка

Я всю ночь думал над этой проблемой: вот моя матрица:

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

.....

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

Пишу на R. Спасибо.


person Jiang Du    schedule 10.04.2014    source источник
comment
Вы хотите удалить оба дубликата или только один?   -  person CCurtis    schedule 10.04.2014
comment
Какой результат вы хотите получить? F T F T или T T T T ? (F-не дубликат, T-дублирование)   -  person bartektartanus    schedule 10.04.2014
comment
Я думаю, что это довольно близко, но я получаю сообщение об ошибке. Странно, потому что это работает, если вы вручную указываете i и n, но когда я позволяю повторять и контролировать их, это не работает. Предполагается, что все повторяющиеся строки обозначаются как NA. тогда вы можете просто удалить их for(i in 1:length(df[,1])){x=(1:length(df[,1])) x=x[!x==i] for(n in 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} }   -  person CCurtis    schedule 10.04.2014
comment
Я хочу получить результат: F T F T или T F T F, и таким образом я могу использовать индикатор для выбора строк.   -  person Jiang Du    schedule 10.04.2014


Ответы (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, поэтому вы просто обертываете все это `duplicated, чтобы найти, какие элементы (строки) дублируются.

person A5C1D2H2I1M1N2O1R2T1    schedule 10.04.2014
comment
Спасибо за вашу помощь. Но у меня что-то не так с моими тестовыми данными: /// x=matrix(c(0,3,2,3,0,1,2,1,0),3,3)/// z=as.vector (x)/// ind=z›=1/// y=c('a','b','c')/// yy=expand.grid(y,y)//// yyy= cbind(yy,z)[ind,]//// продублировано( lapply(1:nrow(yyy), function(y){ A ‹- yyy[y, ] A[order(A)] })) // / [1] FALSE FALSE FALSE FALSE FALSE FALSE///Я не знаю, как сделать, чтобы код не отображался в той же строке. Извиняюсь. - person Jiang Du; 10.04.2014
comment
случилось и со мной! Причина, вероятно, в том, что у вас есть имена столбцов, назначенные в x. Вот что происходит: order(A) аккуратно упорядочивает строку и возвращает упорядоченную версию строки с именами столбцов. Однако результирующий объект из lapply учитывает имена столбцов и передает duplicated версию, в которой имена столбцов не повреждены. Таким образом, то, что считается дублированным, совпадает с x! Смотрите мой ответ для решения. - person agoldev; 26.01.2017

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

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

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

И короче ;)

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

person agoldev    schedule 26.01.2017

Для начала вы можете сослаться на на документация для отличного пакета R под названием 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)

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

person Nathaniel Payne    schedule 10.04.2014
comment
duplicated действительно правильная функция (не пакет), но я не уверен, как это помогает OP получить ответ. - person A5C1D2H2I1M1N2O1R2T1; 10.04.2014