绘制R中1个观测值的83个变量

时间:2016-01-03 01:23:58

标签: r subset

我有一个包含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')

但这意味着我需要复制每个犯罪/年的原始数据框中的所有数字,我认为不是这样做的。我已经在原始数据集中拥有所有这些信息。

下一步应该是什么? 谢谢。

1 个答案:

答案 0 :(得分:3)

我首先将数据重新整形为长格式,即使用InterfaceBvillagecrimeyear的列,从而解决问题。然后,您可以非常轻松地根据这些变量对数据进行子集化。

使用包countreshape2,这种类型的整形操作非常简单。

这是一个例子。

首先,我们创建一些假设数据(我认为)与您的数据格式匹配:

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列中的文字并将其拆分为两列,指定为CrimeCrime,在Year分割(即坚持) .Count.列之前的所有内容,.Count.列中的所有内容以及Crime列之后的所有内容。分隔符本身(.Count.)将被丢弃。
  • Year使用给定值创建新列或覆盖现有列。在这里,我们使用.Count.中的空格和mutate中的连字符替换句点(Crime)来整理Year.列。

结果是:

Crime

我们现在可以将这些数据过滤到感兴趣的子集,并绘制它们:

Year

enter image description here