2015-01-14 4 views
3

У меня есть кадр данных, где я хочу сравнить группу строк и удалить только в том случае, если вся группа одинакова. Например:Поиск уникальной группы строк в кадре данных

df<-data.frame(X=c("a", "a", "a", "b", "b", "b", "c", "c", "c"), Y=c(1,2,1,2,2,2,1,2,1), Z=c("ABC","DEF","ABC", "DEF", "DEF", "DEF", "ABC", "DEF", "ABC")) 

    X Y Z 
1 a 1 ABC 
2 a 2 DEF 
3 a 1 ABC 
4 b 2 DEF 
5 b 2 DEF 
6 b 2 DEF 
7 c 1 ABC 
8 c 2 DEF 
9 c 1 ABC 

Здесь группа идентифицируется столбцом X, и я хочу сравнить ее между различными группами. Итак, здесь группа a и группа c идентичны. Я хочу, чтобы получить конечный желаемый результат, как показано ниже:

GroupID Y Z 
1 1  1 ABC 
2 1  2 DEF 
3 1  1 ABC 
4 2  2 DEF 
5 2  2 DEF 
6 2  2 DEF 

Любая идея, как я могу сделать этот вид сравнения?

+0

Так, ДФ <- ДФ [! Дублируется (ДФ),]? –

+0

@OliverKeyes Это приведет к удалению строки за строкой, и в этом случае он вернет 5 строк. В ожидаемом ответе выше есть 6 строк. –

+0

Итак, вы ищете, для каждого уникального значения X, извлекаете отдельные (Y, Z) кортежи? –

ответ

2

base R возможность:

# For each 'X', collapse 'Y' and 'Z' to a vector 
l <- by(df[ , c("Y", "Z")], df$X, function(dat) paste0(dat, collapse = "")) 

# select names of unique list elements 
nm <- names(l)[!duplicated(l)] 

# use these names to subset the data frame 
df[df$X %in% nm, ] 
# X Y Z 
# 1 a 1 ABC 
# 2 a 2 DEF 
# 3 a 1 ABC 
# 4 b 2 DEF 
# 5 b 2 DEF 
# 6 b 2 DEF 
2

Возможно, вам придется заглянуть в функцию compare из пакета «Сравнить». Вот возможность:

library(compare) 
x <- with(df, split(df[-1], df[[1]])) 
Splits <- combn(names(x), 2) 
Comparison <- apply(Splits, 2, function(y) { 
    compare(x[y[1]], x[y[2]], allowAll = TRUE)$result 
}) 
Splits[, Comparison] 
# [1] "a" "c" 

Из этого мы можем видеть, что группы «а» и «с» дублируются, и мы можем использовать, чтобы подмножество оригинального набора данных.


Я использовал в этом ответе allowAll = TRUE, но вы можете посмотреть на другие варианты, доступные в compare, чтобы решить, какие преобразования вы на самом деле хотите, чтобы в ваших сравнениях.

+0

Кадр данных немного отличается от того, что было показано в вопросе выше. Когда я печатаю вывод 'compare'. Я получаю следующий результат: 'FALSE [TRUE TRUE TRUE TRUE TRUE]' Сравнение отдельных столбцов в порядке (показывает все TRUE), но я не понимаю, почему результатом является FALSE. Есть идеи? –

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