R — Разделение строки на несколько строк

#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. Хорошо, я отредактировал ответ, дайте мне знать, если возникнут какие-либо проблемы.