Извлечение элементов, общих во всех группах столбцов

У меня есть R-dataset x, как показано ниже:

ID Month 1 1 Jan 2 3 Jan 3 4 Jan 4 6 Jan 5 6 Jan 6 9 Jan 7 2 Feb 8 4 Feb 9 6 Feb 10 8 Feb 11 9 Feb 12 10 Feb 13 1 Mar 14 3 Mar 15 4 Mar 16 6 Mar 17 7 Mar 18 9 Mar 19 2 Apr 20 4 Apr 21 6 Apr 22 7 Apr 23 8 Apr 24 10 Apr 25 1 May 26 2 May 27 4 May 28 6 May 29 7 May 30 8 May 31 2 Jun 32 4 Jun 33 5 Jun 34 6 Jun 35 9 Jun 36 10 Jun 

Я пытаюсь выяснить функцию / код R, чтобы идентифицировать все идентификаторы, которые существуют по крайней мере один раз в месяц. В приведенном выше случае ID 4 и 6 присутствуют в течение всех месяцев.

благодаря

Сначала разделите df$ID на Month и используйте intersect для поиска элементов, общих для каждой подгруппы.

 Reduce(intersect, split(df$ID, df$Month)) #[1] 4 6 

Если вы хотите подмножить соответствующий data.frame, сделайте

 df[df$ID %in% Reduce(intersect, split(df$ID, df$Month)),] 

Мы можем использовать data.table . Преобразуйте ‘data.frame’ в ‘data.table’ ( setDT(df1) ), сгруппированные по ‘ID’, получите индекс строки ( .I ), где число уникальных «Месяцев» равно числу уникальных ‘ Месяцы во всем наборе данных и подмножество данных на основе этого

 library(data.table) setDT(df1)[df1[, .I[uniqueN(Month) == uniqueN(df1$Month)], ID]$V1] # ID Month # 1: 4 Jan # 2: 4 Feb # 3: 4 Mar # 4: 4 Apr # 5: 4 May # 6: 4 Jun # 7: 6 Jan # 8: 6 Jan # 9: 6 Feb #10: 6 Mar #11: 6 Apr #12: 6 May #13: 6 Jun 

Чтобы извлечь ‘ID’

 setDT(df1)[, ID[uniqueN(Month) == uniqueN(df1$Month)], ID]$V1 #[1] 4 6 

Или с base R

1) Использование table с rowSums

 v1 <- rowSums(table(df1) > 0) names(v1)[v1==max(v1)] #[1] "4" "6" 

Эта информация может использоваться для подмножества данных

 subset(df1, ID %in% names(v1)[v1 == max(v1)]) 

2) Использование tapply

 lst <- with(df1, tapply(Month, ID, FUN = unique)) names(which(lengths(lst) == length(unique(df1$Month)))) #[1] "4" "6" 

Или используя dplyr

 library(dplyr) df1 %>% group_by(ID) %>% filter(n_distinct(Month)== n_distinct(df1$Month)) %>% .$ID %>% unique #[1] 4 6 

или если нам нужно получить строки

 df1 %>% group_by(ID) %>% filter(n_distinct(Month)== n_distinct(df1$Month)) # A tibble: 13 x 2 # Groups: ID [2] # ID Month #   # 1 4 Jan # 2 6 Jan # 3 6 Jan # 4 4 Feb # 5 6 Feb # 6 4 Mar # 7 6 Mar # 8 4 Apr # 9 6 Apr #10 4 May #11 6 May #12 4 Jun #13 6 Jun 
  • Ошибка в model.frame.default ... переменная длина отличается
  • Какой самый полезный трюк?
  • Удалите повторяющиеся пары столбцов, сортируйте строки на основе двух столбцов
  • Импорт CSV-файла в R-числовые значения, считанные как символы
  • Как сортировать буквы в строке?
  • условие имеет длину> 1, и только первый элемент будет использоваться в if else statement
  • Объедините (rbind) кадры данных и создайте столбец с именем исходных кадров данных
  • Возвращаемый индекс наименьшего значения в векторе?
  • Как мне назвать столбец имен строк в r
  • Не удалось установить пакеты в последней версии RStudio и R версии.3.1.1
  • определить параметр $ right с переменной в R
  • Давайте будем гением компьютера.