Извлечение элементов, общих во всех группах столбцов
У меня есть 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
присутствуют в течение всех месяцев.
благодаря
- Выберите эквивалентные строки
- как вы отправляете письмо от R
- Разверните строки по дате с использованием даты начала и окончания
- Форматирование больших валютных или долларовых значений в миллионы / миллиарды
- Слишком мало периодов для разложения ()
- Прочтите файл csv в R со столбцом валюты как числовой
- Существует pmin и pmax, каждый из которых принимает na.rm, почему нет psum?
- Максимальная длина для вектора в R
- Стандартный способ удаления нескольких элементов из фрейма данных
- Измените class с коэффициента на числовое число столбцов в кадре данных
- Возьмите сумму переменной, если комбинация значений в двух других столбцах уникальна
- Есть ли такой «colsd» в R?
- Матрица корреляции сюжетов в граф
Сначала разделите 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