Как я могу сгруппировать возраст по столбцу месяца и года?

Мне нужно оценить данные для статьи с помощью RStudio. Я хочу сгруппировать возраст следующим образом:

"до 18" , «18-25» «26-35» «36-45» «46-55» «56-65» «66-75» «76 и старше»

Дата сбора данных — июнь/июль 2024 года. У меня есть один столбец с месяцем и один с годом из 227 участников. Может ли кто-нибудь помочь мне с кодом, как я могу рассчитать и сгруппировать возраст по столбцам месяца и года?

Я спросил Chat GPT, и он дал мне это. Но когда я запускаю его, он говорит: «Ошибка в if (год > 2006 || (год == 2006 && месяц > 7)) {: отсутствует значение, где необходимо ИСТИНА/ЛОЖЬ». Я не знаю, имеет ли этот код смысл.

current_Jahr <- 2024
current_Monat <- 7
Groups <- list(
  "under 18" = c(2006, Inf),
  "18-25" = c(1998, 2006),
  "26-35" = c(1988, 1998),
  "36-45" = c(1978, 1988),
  "46-55" = c(1968, 1978),
  "56-65" = c(1958, 1968),
  "66-75" = c(1948, 1958),
  "76 and older" = c(-Inf, 1948)
)
function_age <- 
  function(year, month, current_year, current_month) {
  if (year > 2006 || (year == 2006 && month > 7)) { 
    return("under18")
  } else if (year > 1998 || (year == 1998 && month > 7)) {
    return("18-25")
  } else if (year > 1988 || (year == 1988 && month > 7)) {
    return("26-35")
  } else if (year > 1978 || (year == 1978 && month > 7)) {
    return("36-45")
  } else if (year > 1968 || (year == 1968 && month > 7)) {
    return("46-55")
  } else if (year > 1958 || (year == 1958 && month > 7)) {
    return("56-65")
  } else if (year > 1948 || (year == 1948 && month > 7)) {
    return("66-75")
  } else {
    return("76 and older")
  }
}
Age_groups <- mapply(function_year, age$year, age$moth, 
                       MoreArgs = list(current_year, current_month))
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предполагаемые входные данные показаны в примечании в конце.

Классyearmon внутренне представляет год и месяц как год + 0/12 для января, год + 1/12 для февраля, ..., год + 11/12 для декабря, поэтому вычислите текущий год/месяц как объектyearmon и год. и месяц в фрейме данных возраста как объект Yearmon, возьмите разницу и отбросьте дробную часть (месяц), чтобы получить возраст. Используйте cut, чтобы сформировать группы.

library(dplyr)
library(zoo)

current_ym <- as.yearmon(paste(current_Jahr, current_Monat, sep = "-"))
age |>
  mutate(age = as.integer(current_ym - as.yearmon(paste(year, month, sep = "-"))),
         age_group = cut(age, breaks, labels))

предоставление

   year month age age_group
1  1984     1  40     36-45
2  1988     1  36     36-45
3  2014    12   9  under 18
4  1979    12  44     36-45
5  2003     5  21     18-25
6  1982     7  42     36-45
7  1994     7  30     26-35
8  1966     6  58     56-65
9  2001     2  23     18-25
10 1948    10  75     66-75
11 1950     7  74     66-75
12 1968     4  56     56-65
13 1985    10  38     36-45
14 2023     6   1  under 18
15 1941     6  83   over 75

Примечание

Входные данные в воспроизводимой форме

current_Jahr <- 2024
current_Monat <- 7
breaks <- c(-Inf, 18-1/12, seq(25, 75, 10), Inf)
labels <- c("under 18", "18-25", "26-35", "36-45", "46-55", "56-65", "66-75", "over 75")
set.seed(31)
age <- data.frame(year = sample(1940:2023, 15, TRUE),
                  month = sample(12, 15, TRUE))

Спасибо за помощь! Но меня сбивает с толку то, куда я вставляю свой фрейм данных «Альтер» с собранными годами рождения («Яр») и месяцем («Монат») моих участников. У меня 227 участников и годы варьируются от 1936-2013.

Hilde348 06.08.2024 15:15

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

G. Grothendieck 06.08.2024 15:28
Ответ принят как подходящий

Нам не нужны никакие дополнительные библиотеки/пакеты, это можно легко сделать с помощью базы R. Я изменил ваши интервалы, поскольку они не имели особого смысла, поскольку возраст является непрерывной мерой. (если кому-то 25 лет и шесть месяцев, в какой группе он должен быть?). Я сделал так, что все группы слева закрыты. 25-35 означает [25,35), то есть от 25 включительно до 35, но не включая.

# Example data

set.seed(1)
n <- 20
id0 <- apply(do.call(expand.grid, rep(list(LETTERS), 3)), 1, paste, collapse = ".")
dtf <- data.frame(
  id=sample(id0, n), 
  year=sample(1930:2023, n, rep=TRUE),
  month=sample(1:12, n, rep=TRUE)
)

# Define the date age will be calculated to
now <- as.Date("2024-07-01")

# Covert year and month to Date format, assuming medio of each month
dtf$date <- as.Date(with(dtf, paste(year, month, "15", sep = "-")))

# Calculating number of years between date and now
dtf$age <- as.numeric((now - dtf$date)/365.24)

# Dividing age into groups
dtf$agegroup <- cut(
  x=dtf$age, 
  breaks=c(0, 18, 15 + (1:6)*10, Inf),
  labels=c("under 18", "18-25", "25-35", "35-45", "45-55", "55-65", "65-75", "75 and older"),
  right=FALSE
)

dtf
#       id year month       date       age     agegroup
# 1  M.X.G 2017    10 2017-10-15  6.710656     under 18
# 2  O.R.J 1949     8 1949-08-15 74.879531        65-75
# 3  F.X.O 1991    10 1991-10-15 32.712737        25-35
# 4  V.P.X 1941     7 1941-07-15 82.964626 75 and older
# 5  H.G.F 1955     7 1955-07-15 68.965612        65-75
# 6  D.J.X 1966    10 1966-10-15 57.712737        55-65
# 7  J.O.Y 1931     1 1931-01-15 93.461833 75 and older
# 8  N.E.R 1965     6 1965-06-15 59.046107        55-65
# 9  C.J.Q 2011     9 2011-09-15 12.794327     under 18
# 10 T.P.B 1961     9 1961-09-15 62.794327        55-65
# 11 E.J.F 1975     6 1975-06-15 49.047202        45-55
# 12 H.P.E 1986    11 1986-11-15 37.627314        35-45
# 13 C.W.R 1976     6 1976-06-15 48.045121        45-55
# 14 M.Z.J 1947     3 1947-03-15 77.299858 75 and older
# 15 Z.Z.T 2007     1 2007-01-15 17.459752     under 18
# 16 E.Y.M 1992     2 1992-02-15 32.375972        25-35
# 17 R.Q.S 2004     4 2004-04-15 20.211368        18-25
# 18 W.T.Z 1940     7 1940-07-15 83.963969 75 and older
# 19 Q.W.J 1998     8 1998-08-15 25.878874        25-35
# 20 Z.E.U 1968     5 1968-05-15 56.130216        55-65

Другие вопросы по теме