我有一个很长的(对我而言)复杂的问题。我有来自欧盟理事会的投票数据,其中每个国家的投票行为都按名义比例编码:
0: yes
1: no
2: Abstention
3: no with a negative statement
4: Abstention with a negative statement
5: yes with a negative statement
数据采用以下格式(请参阅文章末尾,以便从数据集中转储20个观测值):
Country1 Country2 Country3 ... Date
1 0 0 ... 2004-12-12
1 2 0 ... 2003-02-14
2 0 1 ... 2004-05-22
... ... ... ... ...
首先,我想将数据汇总为每月一次,每个月我们有一个总和,每个国家有多少0,1,2等。理想情况下,数据应如下所示:
Month Country sum of 0s sum of 1s Sum of 2s
January Country1 2 0 1
January Country2 4 0 0
... ... ... ... ...
完成此操作后,我想将数据放入面板格式,如下所示:
Country Month sum of 0s sum of 1s sum of 2s
Country1 January 2 0 1
Country1 February 0 1 3
... ... ... ... ...
Country2 January 4 0 0
Country2 February 2 2 0
... ... ... ... ...
我很抱歉,如果这是一个非常耗时的问题,但我一直在玩聚合,通过和不同的应用功能永远,而无法获得所需的结果。任何帮助将不胜感激!
来自数据集的20个观察结果(来自dput()函数的输出):
structure(list(Recitals = c(29L, 13L, 2L, 20L, 10L, 18L, 29L,
6L, 4L, 16L, 7L, 6L, 12L, 23L, 6L, 10L, 2L, 6L, 9L, 8L, 7L),
Voting_Rule = structure(c(4L, 4L, 5L, 5L, 5L, 5L, 5L, 4L,
4L, 4L, 5L, 4L, 5L, 4L, 5L, 4L, 4L, 5L, 4L, 4L, 4L), .Label = c("0",
"Qualified Majority", "Simple Majority", "Unanimity", "Qualified majority",
"Simple majority"), class = "factor"), Belgium = c(0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L), Denmark = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
Czech.Republic = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Germany = c(0L,
0L, 0L, 0L, 0L, 4L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L), Estonia = c(0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
), Greece = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Spain = c(0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L), France = c(0L, 0L, 0L, 3L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Ireland = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L), Italy = c(0L, 0L, 0L, 0L, 0L, 0L, 5L,
0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
Cyprus = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Latvia = c(0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L), Lithuania = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Luxembourg = c(0L,
0L, 0L, 0L, 0L, 4L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L), Hungary = c(0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
), Malta = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Netherlands = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L), Austria = c(0L, 0L, 0L, 1L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
), Poland = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Portugal = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L), Slovenia = c(0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L
), Slovakia = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Finland = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L), Sweden = c(0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
UK = c(0L, 0L, 0L, 0L, 0L, 0L, 5L, 0L, 0L, 0L, 5L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), Dates = structure(c(12716,
12716, 12716, 12674, 12674, 12698, 12705, 12724, 12738, 12738,
12716, 12741, 12744, 12754, 12754, 12758, 12758, 12758, 12759,
12759, 12759), class = "Date")), .Names = c("Recitals", "Voting_Rule",
"Belgium", "Denmark", "Czech.Republic", "Germany", "Estonia",
"Greece", "Spain", "France", "Ireland", "Italy", "Cyprus", "Latvia",
"Lithuania", "Luxembourg", "Hungary", "Malta", "Netherlands",
"Austria", "Poland", "Portugal", "Slovenia", "Slovakia", "Finland",
"Sweden", "UK", "Dates"), row.names = c(752L, 753L, 762L, 774L,
775L, 776L, 777L, 780L, 789L, 790L, 793L, 794L, 797L, 816L, 817L,
818L, 819L, 820L, 824L, 825L, 826L), class = "data.frame")
答案 0 :(得分:3)
Hadley的reshape2和plyr包将极大地帮助您的工作:
library(reshape2)
# load your data into variable d1
# d1 <- struct( ... your data ...)
# first, melt the data.
# molten data is very very useful for further transformation.
d2 <- reshape2:::melt.data.frame(d1[,-(1:2)], # drop unused variables
id.vars="Dates",
variable.name="Country")
# create a variable "Month" from Date
d2$Month <- months(d2$Date)
# cast the data to the desired format using appropriate function (here, length())
d3 <- dcast(d2, Country+Month~value, length)
# finally change the names of newly created variables
names(d3)[-(1:2)] <- sprintf("sum of %ss", names(d3)[-(1:2)])