【问题标题】:Creating new variable and new data rows for country-conflict-year observations为国家冲突年观察创建新变量和新数据行
【发布时间】:2018-12-15 04:26:53
【问题描述】:

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

【问题讨论】:

  • 做到了!非常非常感谢。

标签: r


【解决方案1】:

这里不需要任何 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 2018-01-21
    • 1970-01-01
    • 2020-01-30
    • 2013-10-30
    • 2023-01-13
    相关资源
    最近更新 更多