我有一个独特的数据集(纽约市地铁闸门数据),需要按照特定方式重新组织以进行一些分析。我已经编写了代码,但由于数据集非常大,效率不高。希望有人能提出更好的方法。
所涉及的数据集有43列。前三列是唯一标识符(即具体车站的闸门)。然后第4-8列标识计量时间、计量类型、进入和退出。第9-13列以及其余的列直到第43列都遵循相同的模式。数据集很丑陋,因此我不想在这里发布它,但您可以在下面的链接中找到它。您需要查看10/18/14之前的数据。
链接:http://web.mta.info/developers/turnstile.html
所有这些的最终结果是像这样的东西。
所涉及的数据集有43列。前三列是唯一标识符(即具体车站的闸门)。然后第4-8列标识计量时间、计量类型、进入和退出。第9-13列以及其余的列直到第43列都遵循相同的模式。数据集很丑陋,因此我不想在这里发布它,但您可以在下面的链接中找到它。您需要查看10/18/14之前的数据。
链接: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读取数据后,我只用了几个计量表(column 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)
}