使用自定义技术重塑数据框

时间:2013-08-25 10:23:23

标签: r reshape

以下是我的数据集

的示例
df1<- read.table(text=" Month Crime
2010-12 Anti-social-behaviour
2010-12 Anti-social-behaviour
2010-12 Anti-social-behaviour
2010-12 Robbery
2010-12 Robbery
2010-12 Violent-Crime
2010-12 Violent-Crime
2010-12 Theft
2011-01 Anti-social-behaviour
2011-01 Anti-social-behaviour
2011-01 Anti-social-behaviour
2011-01 Anti-social-behaviour
2011-01 Arson
2011-01 Arson
2011-01 Theft
2011-01 Theft
2011-01 Theft
2011-01 Theft
2011-01 Theft", header=TRUE)

我打算将其转换为以下格式以便能够对其进行分析。

Month      Crime                   Frequency
2010-12    Anti-social-behaviour   3
2010-12    Robbery                 2
2010-12    Violent Crime           2
2010-12    Theft                   1
2011-01    Anti-social behaviour   4
2011-01    Arson                   2
2011-01    Theft                   5

由于我不熟悉重塑包,我想教育自己使用基本功能,我制定了自己的方法:

#convert months to factor
crimeData3$Month<- factor(crimeData3$Month, ordered=TRUE)
#calculate instances of each factor level
instances<- table(crimeData3$Month)
mySeq<- numeric(0)
myseqFinal<- numeric(0)
#append letters to each crime for each factor level, to identify crimes at month-level
for (i in 1:length(instances)){
mySeq<- rep(LETTERS[i], times=instances[i])
myseqFinal<- c(myseqFinal,mySeq)
}
crimeData3$CrimeNew<- paste(crimeData3$Crime, myseqFinal, sep=" ")
crimeData3$CrimeNew<- factor(crimeData3$CrimeNew, ordered=TRUE)

我希望在此之后做的是计算每项犯罪的频率。由于所有犯罪都在月级进行了唯一标记,我认为计算频率很简单,只需将结果按照相同的顺序添加到新的数据框中即可。

但是,只要我将表格功能应用于crimeData3 $ Crime,犯罪的顺序就会搞砸。

还有另一种更简单的方法吗?可以操纵我的代码来提供解决方案吗?我很感激使用基本功能和专业功能的任何帮助。

非常感谢。

1 个答案:

答案 0 :(得分:2)

你的想法并不太远。下一步将是aggregate您的输出。请考虑以下事项:

aggregate(CrimeNew ~ Month + Crime, crimeData3, length)
#     Month                 Crime CrimeNew
# 1 2010-12 Anti-social-behaviour        3
# 2 2011-01 Anti-social-behaviour        4
# 3 2011-01                 Arson        2
# 4 2010-12               Robbery        2
# 5 2010-12                 Theft        1
# 6 2011-01                 Theft        5
# 7 2010-12         Violent-Crime        2

至于改进代码,不需要for循环:

myseqFinal <- rep(LETTERS[seq_along(instances)], times = instances)

但是,正如评论中所提到的,您可以在数据的两列上使用table,并将其包含在data.frame中。由于您似乎关注行的顺序以及缺少值的排除,因此我添加了一些行来说明如何获得所需的输出:

out <- data.frame(table(df1))
out <- out[order(factor(out$Month, ordered = TRUE)), ]
#     Month                 Crime Freq
# 1 2010-12 Anti-social-behaviour    3
# 5 2010-12               Robbery    2
# 7 2010-12                 Theft    1
# 9 2010-12         Violent-Crime    2
# 2 2011-01 Anti-social-behaviour    4
# 4 2011-01                 Arson    2
# 8 2011-01                 Theft    5
相关问题