Создание новой переменной и новых строк данных для наблюдений за годами стран-конфликтов - PullRequest
3 голосов
/ 25 марта 2011

Я очень плохо знаком с R, все еще изучая самые основы, и я еще не понял, как выполнить эту конкретную операцию, но это сэкономило бы мне много-много труда и времени.

У меня есть набор данных о международных конфликтах со столбцами для страны и дат, который выглядит примерно так:

country     dates
Angola      1951-1953
Belize      1970-1972

Я хотел бы реорганизовать данные, чтобы создать переменные для начального и конечного года, а также создатьнаблюдаемый год (назовите его 'yrobs') столбец, поэтому набор выглядит примерно так:

country     yrobs  yrstart     yrend
Angola      1951     1951       1953
Angola      1952     1951       1953
Angola      1953     1951       1953
Belize      1970     1970       1972
Belize      1971     1970       1972
Belize      1972     1970       1972

Кто-то предложил использовать фреймы данных и двойной цикл for, но я немного запутался, пытаясь,Любая помощь будет принята с благодарностью, и вы можете свободно использовать фиктивный язык, так как я все еще довольно зеленый в программировании.Большое спасибо.

1 Ответ

9 голосов
/ 25 марта 2011

Здесь не нужно никаких циклов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...