1

以下是我的数据集的示例

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

由于我不熟悉 reshape 包,并且我想自学使用基本函数,我制定了自己的方法:

#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)

在此之后我希望做的是计算每次犯罪的频率。由于所有罪行都在月份级别上进行了唯一标记,因此我认为计算频率并简单地将结果以相同的顺序添加到新数据框中会很容易。

但是,一旦我将 table 函数应用于 crimeData3$Crime,犯罪的顺序就会变得混乱。

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

非常感谢。

4

1 回答 1

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
于 2013-08-25T10:43:10.437 回答