R - найти все уникальные значения среди подмножеств фрейма данных

У меня есть фрейм данных с двумя столбцами. Первый столбец определяет подмножества данных. Я хочу найти все значения во втором столбце, которые появляются только в одном подмножестве в первом столбце.

Например, из:

df=data.frame(
  data_subsets=rep(LETTERS[1:2],each=5),
  data_values=c(1,2,3,4,5,2,3,4,6,7))

data_subsets data_values
      A           1
      A           2
      A           3
      A           4
      A           5
      B           2
      B           3
      B           4
      B           6
      B           7

Я хотел бы извлечь следующий кадр данных.

data_subsets   data_values
    A              1
    A              5
    B              6
    B              7

Я играл сduplicated но я просто не могу заставить его работать. Любая помощь приветствуется. Существует ряд тем, посвященных решению подобных проблем, надеюсь, я не упустил из виду ответ в моих поисках!

EDIT

Я изменил подход @Matthew Lundberg к подсчету количества элементов и извлечению из фрейма данных. По какой-то причине его подход не работал с фреймом данных, который у меня был, поэтому я придумал это, что не так элегантно, но выполняет свою работу:

counts=rowSums(do.call("rbind",tapply(df$data_subsets,df$data_values,FUN=table)))
extract=names(counts)[counts==1]
df[match(extract,df$data_values),]

Ответы на вопрос(3)

Вариант ответа P Lapointe был бы

df[! df$data_values %in% df[duplicated( unique(df)$data_values ), ]$data_values,]

unique() имеет дело с возможностью (не в ваших тестовых данных), что некоторые строки в данных могут быть идентичными, и вы хотите сохранить их один раз, если то же самоеdata_values не появляется для отчетливыхdata_sets (или отличить другие столбцы).

duplicated, Хитрость заключается в том, чтобы объединитьfromLast = TRUE а такжеfromLast = FALSE варианты, чтобы получить полный список недублированных строк.

!duplicated(df$data_values,fromLast = FALSE)&!duplicated(df$data_values,fromLast = TRUE)
 [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE

Индексирование вашего data.frame с этим вектором дает:

df[!duplicated(df$data_values,fromLast = FALSE)&!duplicated(df$data_values,fromLast = TRUE),]
   data_subsets data_values
1             A           1
5             A           5
9             B           6
10            B           7
 jslefche04 июн. 2012 г., 00:16
Спасибо! Кажется, хорошо работает для примера набора данных, но у меня были трудности с применением моего собственного набора данных. Смотрите мою правку для моего (не элегантного) решения
Решение Вопроса

Сначала найдите количество каждого элемента в df $ data_values:

 x <- sapply(df$data_values, function(x) sum(as.numeric(df$data_values == x)))

> x
 [1] 1 2 2 2 1 2 2 2 1 1

Теперь извлеките строки:

> df[x==1,]
   data_subsets data_values
1             A           1
5             A           5
9             B           6
10            B           7

Обратите внимание, что вы пропустили "5" выше. Нет "B 5".

 jslefche03 июн. 2012 г., 21:37
Отлично, спасибо - отредактировано выше, чтобы отразить мою ошибку! При применении к моему собственному набору данных я получаю сообщение об ошибке "наборы факторов различаются". Будем расследовать и сообщать обратно.
 jslefche04 июн. 2012 г., 00:16
Работает для примера набора данных, поэтому upvote, но по какой-то причине не будет работать для моего реального набора данных. Посмотрите правку вверху, чтобы увидеть мое (неэлегантное) решение

Ваш ответ на вопрос