我有一个包含131个观测数据的数据框,每个数据框有83个变量(不同犯罪数量的村庄 - 暴力,汽车盗窃等,在不同年份)。我需要选择一个观察(一个村庄)并绘制针对不同年份的特定变量(例如暴力犯罪计数)。
我通过以下方式对村庄进行了分类:
my_data<- data[which(data$WardName =='village_name'), ]
现在我有一个包含83个变量的观察结果。
如何绘制“2007 - 2008年”,“2008-2009”,“2009-2010”多年的“车辆犯罪数”?变量名称为“Vehicle.Crime.Count.2008.2009”,“Vehicle.Crime.Count.2009.2010”等。
我尝试创建一个新的数据框
year <- c('2007-2008', '2008-2009', '2009-2010', '2010-2011',
'2011-2012', '2012-2013', '2013-2014', '2014-2015')
crime <- c('Total Crime Count', 'ASB', 'Burglary Dwelling', 'Criminal Damage',
'Deliberate Fires', 'Domestic Abuse', 'Theft of Pedal Cycles',
'Vehicle Crime', 'Violence Against the Person', 'Violent Crime')
但这意味着我需要复制每个犯罪/年的原始数据框中的所有数字,我认为不是这样做的。我已经在原始数据集中拥有所有这些信息。
下一步应该是什么? 谢谢。
答案 0 :(得分:3)
我首先将数据重新整形为长格式,即使用InterfaceB
,village
,crime
和year
的列,从而解决问题。然后,您可以非常轻松地根据这些变量对数据进行子集化。
使用包count
或reshape2
,这种类型的整形操作非常简单。
这是一个例子。
首先,我们创建一些假设数据(我认为)与您的数据格式匹配:
tidyr
加载一些有用的包:
d <- data.frame(Village=LETTERS[1:5],
Vehicle.Crime.Count.2008.2009=rpois(5, 20),
Vehicle.Crime.Count.2009.2010=rpois(5, 20),
Vehicle.Crime.Count.2010.2011=rpois(5, 20),
Vehicle.Crime.Count.2011.2012=rpois(5, 20),
Violent.Crime.Count.2008.2009=rpois(5, 20),
Violent.Crime.Count.2009.2010=rpois(5, 20),
Violent.Crime.Count.2010.2011=rpois(5, 20),
Violent.Crime.Count.2011.2012=rpois(5, 20))
将数据重塑为长格式:
library(tidyr)
library(dplyr)
library(ggplot2)
解释上述内容:
d_long <- gather(d, key=Crime, value=Count, -Village) %>%
separate(Crime, c('Crime', 'Year'), '\\.Count\\.') %>%
mutate(Crime=factor(gsub('\\.', ' ', Crime)),
Year=factor(sub('\\.', '-', Year)))
“正向管道”运算符将表达式链接在一起,因此,例如,%>%
会将1:10 %>% head
的结果发送到1:10
函数,作为第一个论点。有关详细信息/示例,请参阅head
。 ?dplyr::`%>%`
将所有列(我们已用gather
排除的Village
除外)列入两列:一列称为-Village
,其中包含与观察相关联的旧列名称,以及一个称为key
的列名称,其中包含旧单元格的值。我们指定要将最终键列调用value
,将最终值列称为Crime
。Count
获取separate
列中的文字并将其拆分为两列,指定为Crime
和Crime
,在Year
分割(即坚持) .Count.
列之前的所有内容,.Count.
列中的所有内容以及Crime
列之后的所有内容。分隔符本身(.Count.
)将被丢弃。Year
使用给定值创建新列或覆盖现有列。在这里,我们使用.Count.
中的空格和mutate
中的连字符替换句点(Crime
)来整理Year
和.
列。结果是:
Crime
我们现在可以将这些数据过滤到感兴趣的子集,并绘制它们:
Year