我有一个外观独特的数据集(NYC MTA 旋转门数据),我需要以某种方式重新组织它以执行一些分析。我编写了有效但效率不高的代码,因为它是一个非常大的数据集。我希望有人可以提出更好的方法。
有问题的数据集有 43 列。第 1-3 列是唯一标识符(即特定车站的旋转门)。然后第 4-8 列标识计量时间、计量类型、条目,然后退出。9-13,然后是 43 的其余列遵循相同的模式。数据集很丑,所以我不想在这里发布,但你可以在下面的链接中找到它。您将不得不查看 2014 年 10 月 18 日之前的数据。
http://web.mta.info/developers/turnstile.html
#Vector of column numbers that identifies the break
a <- c(4, 9, 14, 19, 24, 29, 34, 39)
#The actual loop to re-sort the data
for (i in 1:nrow(data)) {
for (j in 1:length(a)) {
if (j == 8 ){ all <- rbind(all, cbind(data[i, 1:3], data[i, a[j]:43])) }
else { all <- rbind(all, cbind(data[i, 1:3], data[i,a[j]:(a[j+1]-1)])) } } }
所有这一切的最终结果是这样的。
1 2 3 1 2 3 4 5
5083 H026 R137 00-00-00 10-04-14 00:00:00 REGULAR 4072851 10491832
50831 H026 R137 00-00-00 10-04-14 04:00:00 REGULAR 4072918 10492356
50832 H026 R137 00-00-00 10-04-14 08:00:00 REGULAR 4073125 10492613
50833 H026 R137 00-00-00 10-04-14 12:00:00 REGULAR 4073511 10493116
50834 H026 R137 00-00-00 10-04-14 16:00:00 REGULAR 4073820 10493877
50835 H026 R137 00-00-00 10-04-14 20:00:00 REGULAR 4074140 10494817
它有效,但我知道有一种更有效的方法可以做到这一点。任何帮助将不胜感激!
编辑:
我应该对此添加更多内容,因为我遗漏了一些可能会改变方法的关键部分。在我用 read.csv 读入数据后,我只用几个米(第 2 列)对数据进行了子集化。因为我喜欢这个建议,所以我将子集数据转换为字符串,如下所示。这实际上表现得相当不错,但任何进一步的建议将不胜感激!
out1 <- function() {
data <- read.csv(name, header=FALSE)
##Isolate data for stations included in network area
station <- subset(data, V2%in% station_names)
data <- apply(station, 1, paste, collapse=",")
starts <- seq(from=4, to=43, by=5)
new_data <- rbindlist(lapply(strsplit(data, ","), function(x) {
rbindlist(lapply(starts, function(y) {
as.list(x[c(1:3, y:(y+4))])
}))
}))
setnames(new_data, colnames(new_data), c("C.A", "UNIT", "SCP", "DATE", "TIME","DESC", "ENTRIES", "EXIT"))
new_data <- as.data.frame(new_data)
}