#r
#r
Вопрос:
У меня есть демографические данные, которые в настоящее время разбиты на 18 возрастных групп с интервалом в 5 лет. Мой первый шаг — взять эти данные и разложить их по интервалам в 1 год.
Вот небольшой образец данных
CountyID Year Agegrp TOT_POP TOT_MALE TOT_FEMALE
1001 2000 1 3029 1503 1526
1001 2000 2 3619 1874 1745
1001 2000 3 3776 1976 1800
1001 2000 4 3297 1698 1599
1001 2000 5 2366 1193 1173
Имейте в виду, что это небольшая выборка, полный набор данных равен 849870 X 30.
Что я хочу сделать, так это взять каждую строку и разделить от TOT_POP вправо (эти другие строки более подробно описаны с номерами совокупности) на 5, создавая при этом 5 НОВЫХ строк. Примером для первой строки после разбиения на 5 отдельных строк будет:
CountyID Year Age TOT_POP TOT_MALE TOT_FEMALE
1001 2000 0 605.8 300.6 305.2
1001 2000 1 605.8 300.6 305.2
1001 2000 2 605.8 300.6 305.2
1001 2000 3 605.8 300.6 305.2
1001 2000 4 605.8 300.6 305.2
Эти пять новых строк теперь будут представлять собой возрастную группу, разбитую на отдельные годы. Позже я применю соответствующие веса к каждому отдельному году, но сейчас мне нужно выяснить, как разделить каждую строку на новую строку на основе приведенных выше критериев.
Надеюсь, я ясно выразился.
Спасибо!
Ответ №1:
Лучший способ сделать это — использовать индексацию. Итак, если ваш фрейм данных d
,
d <- d[rep(1:nrow(d), each = 5), ] # repeat each row 5 times
d[c("TOT_POP", "TOT_MALE", "TOT_FEMALE")] <-
d[c("TOT_POP", "TOT_MALE", "TOT_FEMALE")] / 5 # divide the desired cols by 5
d$Agegrp <- rep(0:4, each = 5)
names(d)[which(names(d) == "Agegrp")] <- "Age"
Прежде чем делать это, убедитесь, что ваши данные отсортированы правильно, поскольку в конечном итоге вы можете переименовать неправильные возрастные группы, т. Е. что-то вроде d <- d[order(d$CountyID, d$Year, d$Agegrp), ]
.
Комментарии:
1. Спасибо! Это довольно простая идея, не уверен, почему я сам до этого не додумался. Я изменил Agegrp на Age просто для того, чтобы было легче понять, что я пытался сделать, т. Е. Показывать возраст теперь представляет возраст 0 — 4 вместо скобки.
2. Хорошо, я отредактировал ответ, дайте мне знать, если возникнут какие-либо проблемы.