Мне нужно оценить данные для статьи с помощью 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))
Предполагаемые входные данные показаны в примечании в конце.
Класс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))
Согласно инструкциям в верхней части тега r, вопросы на главной странице должны обеспечивать воспроизводимый ввод. Поскольку в вопросе этого не было, ответ указан в примечании в конце. Вам придется адаптировать ответ к тому, что у вас есть, или адаптировать свои данные так, чтобы они соответствовали предполагаемым данным в примечании, или же предоставить подмножество имеющихся у вас данных, используя dput
, чтобы мы точно знали, что у вас есть.
Нам не нужны никакие дополнительные библиотеки/пакеты, это можно легко сделать с помощью базы 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
Спасибо за помощь! Но меня сбивает с толку то, куда я вставляю свой фрейм данных «Альтер» с собранными годами рождения («Яр») и месяцем («Монат») моих участников. У меня 227 участников и годы варьируются от 1936-2013.