我对 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 循环,但我在尝试时有点困惑。任何帮助将不胜感激,并且可以随意使用虚拟语言,因为我对这里的编程仍然很陌生。非常感谢。

最佳答案

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

library(reshape2)
library(plyr)

创建一些数据:
df <- data.frame(
        country =c("Angola","Belize"),
        dates = c("1951-1953", "1970-1972")
)

使用 reshape 包中的 colsplit 将日期列拆分为两个,并将其绑定(bind)到原始数​​据框。
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

关于r - 为国家冲突年观测创建新变量和新数据行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5425584/

10-11 04:49
查看更多