Как оптимизировать case_when в функции? - PullRequest
0 голосов
/ 28 марта 2020

Я хотел бы написать функцию, которая создает переменную биннинга на основе некоторых необработанных данных. В частности, у меня есть набор дат со значениями возраста для каждого респондента, и я хотел бы написать функцию, которая классифицирует этого человека в возрастную группу, где возрастная группа является параметром этой функции.

Вот что Я начал с:

data <- data.frame(age = 18:100)

foo <- function(data, brackets = list(18:24, 25:34, 35:59)) {
  require(tidyverse)
  tmp <- data %>%
    drop_na(age) %>%
    mutate(age_bracket = case_when(age %in% brackets[[1]] ~ paste(brackets[[1]][1], "to", brackets[[1]][length(brackets[[1]])]),
                                   age %in% brackets[[2]] ~ paste(brackets[[2]][1], "to", brackets[[2]][length(brackets[[2]])]),
                                   age %in% brackets[[3]] ~ paste(brackets[[3]][1], "to", brackets[[3]][length(brackets[[3]])])))
print(tmp)
}

Как видно, часть case_when очень негибкая, так как мне нужно заранее указать количество скобок. Это также довольно долго. Я хотел бы написать что-то вроде l oop, которое смотрит на количество элементов в аргументе в скобках и соответственно создает эти скобки. Поэтому, если я хочу добавить возрастную группу 60: Inf, функция должна добавить другую возрастную группу.

После поиска в Интернете я обнаружил, что некоторые используют искаженные выражения (например, квос). Я совершенно не знаком с ними, поэтому изо всех сил стараюсь использовать их для своих целей.

1 Ответ

0 голосов
/ 29 марта 2020

Я думаю, вы ищете функцию cut. Следующее делает работу:

data <- data.frame(age = 18:100)

data$age_bracket <- cut(data$age, breaks = c(0, 18, 25, 35, 60, Inf))

unique(data$age_bracket)
# [1] (0,18]   (18,25]  (25,35]  (35,60]  (60,Inf]
# Levels: (0,18] (18,25] (25,35] (35,60] (60,Inf]

Вы также можете определить labels, если вы не связываете метки скобок по умолчанию. Преимущество использования cut вместо решения с ручным кодированием состоит в том, что вы выполняете обычные операции (например, заказ) с выводом cut

...