Я хотел бы создать фрейм данных output ниже после группировки и оценки условий строки. Когда я группирую и резюмирую фрейм данных, я вижу, что есть три экземпляра Ford, которые можно резюмировать как: Ford, 1 SUV и 2 Truck. Точно так же Хонду можно резюмировать как Хонду, 2 Седана и Тойоту можно резюмировать как Тойоту, 1 Электро и 1 Грузовик. Кроме того, необходимо суммировать количество экземпляров после группировки. Так, в случае Ford он появляется три раза, Honda появляется два раза, а Toyota появляется два раза. Меня интересует только представление случаев, когда марка появляется более одного раза, поэтому Kia и Nissan не будут иметь отношения к этому набору и не будут отображаться на выходе. Было бы неплохо, если бы это могло быть в форма функции, поскольку я планирую использовать ее в списке фреймов данных. Это не обязательно на 100%, поскольку я могу добавить его в функцию, если она не представлена ​​в этом формате.

В:

structure(list(Set = c(1, 1, 1, 1, 1, 1, 1, 1, 1), Make = structure(c(1L, 
2L, 5L, 1L, 4L, 2L, 5L, 3L, 1L), .Label = c("Ford", "Honda", 
"Kia", "Nissan", "Toyota"), class = "factor"), Line = structure(c(5L, 
3L, 5L, 4L, 1L, 3L, 2L, 3L, 5L), .Label = c("CSUV", "Electric", 
"Sedan", "SUV", "Truck"), class = "factor")), class = "data.frame", row.names = c(NA, 
-9L))

>
  Set   Make     Line
1   1   Ford    Truck
2   1  Honda    Sedan
3   1 Toyota    Truck
4   1   Ford      SUV
5   1 Nissan     CSUV
6   1  Honda    Sedan
7   1 Toyota Electric
8   1    Kia    Sedan
9   1   Ford    Truck

in %>% dplyr::group_by(Set,Make,Line) %>% dplyr::summarise(n = n()) %>% dplyr::arrange(Make)

# A tibble: 7 x 4
# Groups:   Set, Make [5]
    Set Make   Line         n
  <dbl> <fct>  <fct>    <int>
1     1 Ford   SUV          1
2     1 Ford   Truck        2
3     1 Honda  Sedan        2
4     1 Kia    Sedan        1
5     1 Nissan CSUV         1
6     1 Toyota Electric     1
7     1 Toyota Truck        1

Вывод:

structure(list(Set = c(1, 1, 1), Groups = structure(1:3, .Label = c("Ford_1Suv_2Truck", 
"Honda_1Sedan_1Van", "Toyota_1Electric_1Truck"), class = "factor"), 
    TotalInstances = structure(c(2L, 1L, 1L), .Label = c("2", 
    "3"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

> 
  Set              Groups Cases
1   1    Ford_1Suv_2Truck     3
2   1        Honda_2Sedan     2
3   1 Toyota_1Electric_1Truck 2
1
On_an_island 13 Окт 2020 в 05:53

1 ответ

Лучший ответ

После получения подсчета с помощью summarise и arrange ing, filter строк на основе столбца подсчета 'n' или нового количества после отбрасывания последней группы, затем summarise на вставив (str_c) столбец 'n', 'Line', получить sum из 'n', чтобы создать 'Cases'

library(dplyr)
library(stringr)
in %>% 
    dplyr::group_by(Set, Make, Line) %>%
    dplyr::arrange(Make) %>% 
    dplyr::summarise(Groups = str_c(n, Line, sep="", 
        collapse="_"), Cases = sum(n)) %>% 
    filter(n > 1) %>%        
    ungroup %>% 
    transmute(Set, Groups = str_c(Make, '_', Groups), Cases)

-вывод

# A tibble: 3 x 3
#    Set Groups                  Cases
#  <dbl> <chr>                   <int>
#1     1 Ford_1SUV_2Truck            3
#2     1 Honda_2Sedan                2
#3     1 Toyota_1Electric_1Truck     2

Мы могли бы сделать это быстрее с data.table

library(data.table)
indt <- setDT(in)[, .(n = .N), .(Set, Make, Line)][order(Make)]
indt1 <- indt[indt[, .I[.N > 1|n > 1], .(Set, Make)]$V1] 
indt1[, .(Groups = paste0(n, Line, sep="", collapse="_"), Cases = sum(n)), .(Set, Make)][, Groups := str_c(Make, "_", Groups)]
1
akrun 16 Окт 2020 в 22:35