library(tidyverse)
elec.store <- tibble(computer = c(rep("Dell", 3), rep("HP", 3), rep("Lenovo", 3)),
sold = c(6, 2, 3, 8, 7, 5, 1, 1, 9))
#> # A tibble: 9 x 2
#> computer sold
#> <chr> <dbl>
#> 1 Dell 6
#> 2 Dell 2
#> 3 Dell 3
#> 4 HP 8
#> 5 HP 7
#> 6 HP 5
#> 7 Lenovo 1
#> 8 Lenovo 1
#> 9 Lenovo 9
Скажем, у меня есть фрейм данных моего магазина электроники, как показано выше. Мне бы хотелось, чтобы какой-то тип функции выглядел как-то вроде parting_function(elec.store, c(2, 6))
, который мутировал бы новый столбец, по сути, группируя мои данные в произвольные группы (как показано ниже, в данном случае я выбрал буквы алфавита, но может быть любым). Часть находится после 2-го ряда и 6-го ряда, если это не очевидно.
Существует ли такая «разделяющая» функция, если нет, то как бы я написал эту функцию? Это то, что я хочу сделать, без необходимости вручную выбирать буквы алфавита и количества для повторения (например, 2, 4, 3, как показано ниже):
elec.store %>% mutate(grouping = c(rep("A", 2), rep("B", 4), rep("C", 3)))
# A tibble: 9 x 3
#> computer sold grouping
#> <chr> <dbl> <chr>
#> 1 Dell 6 A
#> 2 Dell 2 A
#> 3 Dell 3 B
#> 4 HP 8 B
#> 5 HP 7 B
#> 6 HP 5 B
#> 7 Lenovo 1 C
#> 8 Lenovo 1 C
#> 9 Lenovo 9 C
2 ответа
Мы можем использовать cut
для разбиения строк через определенные интервалы в part_vector
.
part_vector <- c(2, 6)
elec.store$grouping <- cut(seq_len(nrow(elec.store)),
breaks = c(-Inf, part_vector, Inf),
labels = LETTERS[seq_len(length(part_vector) + 1)])
# A tibble: 9 x 3
# computer sold grouping
# <chr> <dbl> <fct>
#1 Dell 6 A
#2 Dell 2 A
#3 Dell 3 B
#4 HP 8 B
#5 HP 7 B
#6 HP 5 B
#7 Lenovo 1 C
#8 Lenovo 1 C
#9 Lenovo 9 C
Если вы хотите поместить это в dplyr
трубы.
library(dplyr)
elec.store %>%
mutate(grouping = cut(seq_len(n()),
breaks = c(-Inf, part_vector, Inf),
labels = LETTERS[seq_len(length(part_vector) + 1)]))
Вы также можете воссоздать то же самое, используя findInterval
elec.store$grouping <- LETTERS[findInterval(seq_len(nrow(elec.store)),
part_vector, left.open = TRUE) + 1]
Можно было бы создать групповой индекс из логического индекса путем сравнения с row_number
, получить совокупную сумму и использовать этот индекс для изменения ее на LETTERS
(встроенный vector
)
part_vector <- c(2, 6)
elec.store %>%
mutate(grouping = LETTERS[1 + cumsum(row_number() %in% (part_vector + 1))])
# A tibble: 9 x 3
# computer sold grouping
# <chr> <dbl> <chr>
#1 Dell 6 A
#2 Dell 2 A
#3 Dell 3 B
#4 HP 8 B
#5 HP 7 B
#6 HP 5 B
#7 Lenovo 1 C
#8 Lenovo 1 C
#9 Lenovo 9 C
Здесь LETTERS
используется только для примера. Если у нас есть больше групп, это может быть легко создано
grp <- c(LETTERS, do.call(paste0, expand.grid(rep(list(LETTERS), 2))))
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.