Я хотел бы создать фрейм данных 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 ответ
После получения подсчета с помощью 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)]
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.