2013-07-11 9 views
1

Я пытаюсь определить строки в пределах данных, которые являются точными совпадениями, за исключением двух столбцов (т. Е. Я хочу исключить два столбца из рассмотрения совпадений). Ниже приведен примерный кадр.Соответствующие элементы строк в dataframe

x = c(1,2,3,4,5,6,7,1) 
y = c(1,3,4,5,6,7,8,1) 
z = c(1,4,5,6,7,8,9,1) 
year = 1990:1997 
day = c("mon","tues","wed","thurs","fri","sat","sun","sat") 
data = data.frame(cbind(x,y,z,year,day)) 

В приведенном выше примере строки 1 и 8 являются совпадениями, если исключить рассмотрение столбцов за год и день. Есть ли функция, которая позволяет мне это делать? Я просмотрел функции duplicated() и match(), но они не совсем подходят.

+0

Вы уже знаете два столбца или любую комбинацию из двух столбцов в вашем data.frame? – dickoa

+0

Я знаю столбцы, которые я хочу исключить из критериев соответствия, да. – DBK

+0

Что вы подразумеваете под точными совпадениями здесь? Вы хотите увидеть, имеет ли строка одинаковые числа (например, x, y и z) или хотите просмотреть все строки и найти общие числа в строках? –

ответ

3

Это, кажется, что вы хотите (пример изменения данных для лучшего тестирования):

x = c(1,2,3,4,5,6,7,2,1,1,1) 
y = c(1,3,4,5,6,7,8,1,2,1,1) 
z = c(1,4,5,6,7,8,9,1,1,2,1) 
year = 1990:2000 
day = c("mon","tues","wed","thurs","fri","sat","sun","sat","sat","sun","mon") 
data = data.frame(cbind(x,y,z,year,day)) 

which(apply(data[,1:3], 1, function(x){all(tail(duplicated(x), -1))})) 
# [1] 1 11 
+0

Я не думаю, что это отвечает на вопрос. Он идентифицирует строки, где x == y == z, тогда как OP запрашивает идентификацию строк, которые являются дубликатами друг друга, то есть x_i == x_j и y_i == y_j и z_i == z_j. Ответ @ dickoa правильный в этом отношении. – flodel

+0

Действительно, существует несколько интерпретаций «точного соответствия», поднятых @Jdbaba. – QuantIbex

+0

Справа. Цель моего первоначального вопроса заключалась в том, чтобы найти строки, значения столбцов которых соответствуют значениям столбцов других строк. Таким образом, совпадение было бы (1,2,9) и (1,2,9). Это будет одно совпадение. Однако я также хотел, чтобы код идентифицировал другие совпадения (т. Е. Не только соответствие (1,2,9)). – DBK

2

Вот мой подход в два этапа, как только вы знаете, столбцы, которые вы хотите исключить (здесь COLS 4 и 5).

ind <- which(duplicated(data[,1:3], fromLast = TRUE) | 
    duplicated(data[,1:3], fromLast = FALSE)) 
ind 
## [1] 1 8 

data[ind, ] 
## x y z year day 
## 1 1 1 1 1990 mon 
## 8 1 1 1 1997 sat 
+0

Также отлично работает. Благодарю. – DBK

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