Здесь не нужно никаких циклов for. Используйте силу R и его дополнительные пакеты, в частности, plyr и reshape2.
library(reshape2)
library(plyr)
Создать некоторые данные:
df <- data.frame(
country =c("Angola","Belize"),
dates = c("1951-1953", "1970-1972")
)
Используйте colsplit в пакете изменения формы, чтобы разбить столбец дат на две части и привязать его к исходному фрейму данных.
df <- cbind(df, colsplit(df$date, "-", c("start", "end")))
Теперь самое интересное. Используйте ddply в пакете plyr для разделения, применения и объединения (SAC). Это займет df и применить функцию к каждому изменению в стране. Анонимная функция внутри ddply создает небольшой data.frame со страной и наблюдениями, и ключевой бит должен использовать seq () для генерации последовательности от начальной до конечной даты. Сила ddply заключается в том, что он выполняет все это разбиение, объединение и применение за один шаг. Думайте об этом как о цикле в других языках, но вам не нужно отслеживать ваши индексные переменные.
ddply(df, .(country), function(x){
data.frame(
country=x$country,
yrobs=seq(x$start, x$end),
yrstart=x$start,
yrend=x$end
)
}
)
И результаты:
country yrobs yrstart yrend
1 Angola 1951 1951 1953
2 Angola 1952 1951 1953
3 Angola 1953 1951 1953
4 Belize 1970 1970 1972
5 Belize 1971 1970 1972
6 Belize 1972 1970 1972