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