Доступ к строкам в XDF-файле
Я решаю упражнение 2 из https://github.com/MicrosoftLearning/20773_Analyzing-Big-Data-with-Microsoft-R/blob/master/Instructions/20773A_LAB_AK_04.md. Код создает функцию, которая вычисляет время зоны и т. Д. Я не понимаю, почему можно получить доступ к переменным и строкам в файле XDF, например, departureYear <- dataList[[departureYearVarIndex]][i]
внутри функции, но если я попытаюсь сделать то же самое только из файла подмножества:
rxOptions(reportProgress = 1)
flightDelayDataSubsetFile <- "\\\\LON-RSVR\\Data\\flightDelayDataSubset.xdf"
flightDelayDataSubset <- rxDataStep(inData = mergedFlightDelayData,
outFile = flightDelayDataSubsetFile, overwrite = TRUE,
rowSelection = rbinom(.rxNumRows, size = 1, prob = 0.005)
)
как например flightDelayDataSubset[[1]][1]
он говорит мне "Ошибка... этот класс S4 не является поднабором".
Как получить доступ к элементам в файле XDF? Почему это работает в функции, а не вручную для существующего файла? Я, вероятно, задаю неправильный вопрос, потому что я не понимаю, как работает эта функция. Аргумент функции dataList задается как вектор столбцов файла XDF.
transformFunc = standardizeTimes,
transformVars = c("Year", "Month", "DayofMonth", "DepTime", "ActualElapsedTime", "OriginTimeZone")
, В функции он обрабатывается как список [[]] вместо dataList[[arrivalTimeVarIndex]]
, Я совершенно запутался, как это работает. Вопрос, вероятно, в том, как эта функция знает, какой аргумент относится к какому аргументу в
transformVars = c("Year", "Month", "DayofMonth", "DepTime", "ActualElapsedTime", "OriginTimeZone")?
Функция выглядит так:
standardizeTimes <- function (dataList) {
# Check to see whether this is a test chunk
if (.rxIsTestChunk) {
return(dataList)
}
# Create a new vector for holding the standardized departure time
# and add it to the list of variable values
departureTimeVarIndex <- length(dataList) + 1
dataList[[departureTimeVarIndex]] <- rep(as.numeric(NA), times = .rxNumRows)
names(dataList)[departureTimeVarIndex] <- "StandardizedDepartureTime"
# Do the same for standardized arrival time
arrivalTimeVarIndex <- length(dataList) + 1
dataList[[arrivalTimeVarIndex]] <- rep(as.numeric(NA), times = .rxNumRows)
names(dataList)[arrivalTimeVarIndex] <- "StandardizedArrivalTime"
departureYearVarIndex <- 1
departureMonthVarIndex <- 2
departureDayVarIndex <- 3
departureTimeStringVarIndex <- 4
elapsedTimeVarIndex <- 5
departureTimezoneVarIndex <- 6
# Iterate through the rows and add the standardized arrival and departure times
for (i in 1:.rxNumRows) {
# Get the local departure time details
departureYear <- dataList[[departureYearVarIndex]][i]
departureMonth <- dataList[[departureMonthVarIndex]][i]
departureDay <- dataList[[departureDayVarIndex]][i]
departureHour <- trunc(as.numeric(dataList[[departureTimeStringVarIndex]][i]) / 100)
departureMinute <- as.numeric(dataList[[departureTimeStringVarIndex]][i]) %% 100
departureTimeZone <- dataList[[departureTimezoneVarIndex]][i]
# Construct the departure date and time, including timezone
departureDateTimeString <- paste(departureYear, "-", departureMonth, "-", departureDay, " ", departureHour, ":", departureMinute, sep="")
departureDateTime <- as.POSIXct(departureDateTimeString, tz = departureTimeZone)
# Convert to UTC and store it
standardizedDepartureDateTime <- format(departureDateTime, tz="UTC")
dataList[[departureTimeVarIndex]][i] <- standardizedDepartureDateTime
# Calculate the arrival date and time
# Do this by adding the elapsed time to the departure time
# The elapsed time is stored as the number of minutes (an integer)
elapsedTime = dataList[[5]][i]
standardizedArrivalDateTime <- format(as.POSIXct(standardizedDepartureDateTime) + minutes(elapsedTime))
# Store it
dataList[[arrivalTimeVarIndex]][i] <- standardizedArrivalDateTime
}
# Return the data including the new variables
return(dataList)
}
flightDelayDataTimeZonesFile <- "\\\\LON-RSVR\\Data\\flightDelayDataTimezones.xdf"
flightDelayDataTimeZones <- rxDataStep(inData = flightDelayDataSubset,
outFile = flightDelayDataTimeZonesFile, overwrite = TRUE,
transformFunc = standardizeTimes,
transformVars = c("Year", "Month", "DayofMonth", "DepTime", "ActualElapsedTime", "OriginTimeZone"),
transformPackages = c("lubridate")
)
1 ответ
Мой пакет dplyrXdf позволяет индексировать и размещать Xdf-файлы, как будто они являются фреймами данных. Конкретно это определяет [[
а также $
методы извлечения столбцов из файла (но не [
из-за проблем с реализацией)