以下是我的数据集
的示例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,犯罪的顺序就会搞砸。
还有另一种更简单的方法吗?可以操纵我的代码来提供解决方案吗?我很感激使用基本功能和专业功能的任何帮助。
非常感谢。
答案 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