Получите первые n комбинаций по нескольким столбцам в R - PullRequest
0 голосов
/ 06 мая 2020

Получить первые n комбинаций на основе нескольких столбцов, в которых комбинация определяется как большинство вхождений. Скажем, мне нужны 3 первых вхождения из моих входных данных:

Набор входных данных:

Product <- c("XX","XX","XX","ZZ","YY","ZZ","YY","ZZ","YY","YY","XX",
                 "ZZ","XX","ZZ","ZZ","YY","YY","XX","YY","ZZ","ZZ","ZZ","ZZ","YY",
                 "XX","ZZ","ZZ","ZZ","YY","XX")
Grade <- c("A","B","A","C","B","A","C","B","C","A","B", "C","B","A","A","C","A","B","C","A",
               "C", "C","A","B","A","A","A","B","C","A")
Pass <- c(1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,1,1)

Sample_Dataset <- data.frame(Product, Grade, Pass) #input Dataset

Желаемый результат:

> Top3_Combinations
      Product Grade Pass Occurences
1      ZZ     A    0          6
2      YY     C    1          5
3      XX     A    1          4

Также включите комбинации, которые имеют Связи, например, если есть другая комбинация, которая имеет 4 вхождения, также включает ее.

Ответы [ 4 ]

3 голосов
/ 06 мая 2020

Мы можем использовать count для подсчета комбинаций и top_n для выбора трех верхних значений. top_n выберет все связанные значения по умолчанию.

library(dplyr)
Sample_Dataset %>% count(Product, Grade, Pass, sort = TRUE) %>% top_n(3, n)


# A tibble: 3 x 4
#  Product Grade  Pass     n
#  <chr>   <chr> <dbl> <int>
#1 ZZ      A         0     6
#2 YY      C         1     5
#3 XX      A         1     4

В базе R:

df1 <- aggregate(seq_along(Pass)~Product+Grade+Pass, Sample_Dataset, length)
names(df1)[4] <- 'n'
subset(df1, n %in% tail(sort(n), 3))
2 голосов
/ 06 мая 2020

В библиотеке dplyr есть то, что вы ищете, благодаря функциям group_by () и summarize (). Если вы в конечном итоге проделаете много работы в R, это будет ваша цепочка функций для генерации сводной статистики.

Sample_Dataset %>% 
  group_by(Product,Grade,Pass) %>% #choose columns to aggregate 
  summarize(Occurances = n()) %>%  #count the number of occurrances with n() and write to summary column 
  arrange(desc(Occurances)) %>% #sort by occurances, descending  
  head(3) #limit to top 3 results 

Отсюда вы можете отсортировать данные с помощью функцииrange () и выбрать любое произвольное число для максимального количества результатов, которые необходимо сохранить с помощью head ().

1 голос
/ 06 мая 2020

Решение Base R:

unique_df <- unique(data.frame(table(Sample_Dataset)))
top_3_ranked_desc <- head(with(unique_df, unique_df[rev(order(Freq)), ]), 3)

Бонус Base R (в одном обфусцированном выражении):

unique_df <- within(data.frame(head(sort(
  table(apply(Sample_Dataset, 1, paste, collapse = ", ")),
  decreasing = TRUE
), 3)),
{
  Var1 <- as.character(Var1)
  Product <- strsplit(Var1, ", ")[[1]]
  Grade <- strsplit(Var1, ", ")[[2]]
  Pass <- strsplit(Var1, ", ")[[3]]
  rm(Var1)
})
1 голос
/ 06 мая 2020

Вариант с использованием data.table:

library(data.table)
setDT(Sample_Dataset)[, .N, .(Product, Grade, Pass)][N >= last(head(sort(unique(N), TRUE), 3L))]

И если есть связи, и вы хотите, чтобы верхние 3 строки:

setDT(Sample_Dataset)[, .N, .(Product, Grade, Pass)][order(-N), head(.SD, 3L)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...