1

我目前有一个约 83000 行(13 列)的数据框,其中包含 2000-2012 年的犯罪数据,每一行都是犯罪并报告了邮政编码(因此邮政编码 xxxxx 可以在 2001 年、2003 年找到,并以 2007 年为例)。

这是我的数据示例:

 Year Quarter   Zip MissingZip BusCode LossCode NumTheftsPQ  DUL 
 2000       1 99502          1       3        5           2 9479           
 2009       2 99502          2       3        4           3 3220
 2000       1 11111          1       3        5           2 3479           
 2004       2 11111          2       3        4           3 1020

现在,我可以将全局变量分配给我的所有邮政编码(我使用的是 R studio,我显示的数据列表很长,它显着减慢了程序的速度)。以下是我为所有邮政编码分配全局变量的方式:

   for (n in all.data$Zip) {
     x <- subset(all.data, n == all.data$Zip) #subsets the data
     u <- x[1,3] #gets the zip code value
     assign(paste0("Zip", u), x, envir = .GlobalEnv)  #assigns it to a global environment
     #need something here, MasterList <<- ?

}  

我想将所有这些变量包含在一个列表中。例如,如果我所有的邮政编码变量都存储在列表“MasterList”中:

   MasterList["Zip11111"]

将产生数据框:

 Year Quarter   Zip MissingZip BusCode LossCode NumTheftsPQ  DUL 
 2000       1 11111          1       3        5           2 3479           
 2004       2 11111          2       3        4           3 1020

这可能吗?这样做的替代/更快/更好的方法是什么?我希望将这些变量存储在列表中会更有效。

加分点:我知道在我的 for 循环中,我将已经存在的变量重新分配给完全相同的东西,浪费处理时间。我可以添加任何快速行来加快速度吗?

在此先感谢您的帮助!

4

3 回答 3

2

您可以更改for (n in all.data$Zip)for (n in unique(all.data$Zip)). 这将减少冗余。为什么不在循环之前列一个列表,MasterList <- list()然后通过

MasterList[[paste0("Zip", n)]] <- x

是的,我使用n邮政编码,因为n在你告诉它的向量中分配了每个值(在你的情况下all.data$Zip,在我的情况下unique(all.data$Zip)

于 2013-08-11T03:12:16.753 回答
2

制作列表最简单的方法可能是使用该plyr函数,如下所示:

> set.seed(2)
> dat <- data.frame(zip=as.factor(sample(11111:22222,1000,replace=T)),var1=rnorm(1000),var2=rnorm(1000))
> head(dat)
    zip       var1        var2
1 13165 -0.4597894 -0.84724423
2 18915  0.6179261  0.07042928
3 17481 -0.7204224  1.58119491
4 12978 -0.5835119  0.02059799
5 21598  0.2163245 -0.12337051
6 21594  1.2449912 -1.25737890
> library(plyr)
> MasterList <- dlply(dat,.(zip))
> MasterList[["13165"]]
    zip       var1       var2
1 13165 -0.4597894 -0.8472442

但是,听起来速度是您的动力,如果是这样,您最好不要将数据存储在某个单独的列表对象中并将数据框转换为data.table()

> library(data.table)
> dat.dt <- data.table(dat)
> dat.dt[zip==13165]
     zip       var1       var2
1: 13165 -0.4597894 -0.8472442
于 2013-08-11T03:22:19.900 回答
2

仅使用基础 R:

 dat <- read.table(text = "Year Quarter   Zip MissingZip BusCode LossCode NumTheftsPQ  DUL 
+  2000       1 99502          1       3        5           2 9479           
+  2009       2 99502          2       3        4           3 3220
+  2000       1 11111          1       3        5           2 3479           
+  2004       2 11111          2       3        4           3 1020",header = TRUE,sep = "")

> dats <- split(dat,dat$Zip)
> dats
$`11111`
  Year Quarter   Zip MissingZip BusCode LossCode NumTheftsPQ  DUL
3 2000       1 11111          1       3        5           2 3479
4 2004       2 11111          2       3        4           3 1020

$`99502`
  Year Quarter   Zip MissingZip BusCode LossCode NumTheftsPQ  DUL
1 2000       1 99502          1       3        5           2 9479
2 2009       2 99502          2       3        4           3 3220

> names(dats) <- paste0('Zip',names(dats))
> dats
$Zip11111
  Year Quarter   Zip MissingZip BusCode LossCode NumTheftsPQ  DUL
3 2000       1 11111          1       3        5           2 3479
4 2004       2 11111          2       3        4           3 1020

$Zip99502
  Year Quarter   Zip MissingZip BusCode LossCode NumTheftsPQ  DUL
1 2000       1 99502          1       3        5           2 9479
2 2009       2 99502          2       3        4           3 3220
于 2013-08-11T03:25:27.677 回答