为国家冲突年观察创建新的变量和新数据行

时间:2011-03-24 21:11:28

标签: r

我是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

有人建议使用数据框和双循环,但我有点困惑尝试。任何帮助都将非常感激,并随意使用虚拟语言,因为我仍然很喜欢这里的编程。非常感谢。

1 个答案:

答案 0 :(得分:9)

这里不需要任何for循环。使用R及其贡献包的强大功能,特别是plyr和reshape2。

library(reshape2)
library(plyr)

创建一些数据:

df <- data.frame(
        country =c("Angola","Belize"),
        dates = c("1951-1953", "1970-1972")
)

在reshape包中使用colsplit将日期列拆分为两个,然后将其绑定到原始数​​据框。

df <- cbind(df, colsplit(df$date, "-", c("start", "end")))

现在有趣的一点。在包plyr中使用ddply来拆分,应用和组合(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