2017-01-17 20 views
2

Как игнорировать набор данных, если в нем не существует имен столбцов?R rbind - числа столбцов аргументов не совпадают

У меня есть список данных о погоде из потока, но я думаю, что некоторые ключевые погодные условия не существует, и поэтому у меня есть эта ошибка ниже с rbind:

Error in rbind(deparse.level, ...) : 
    numbers of columns of arguments do not match 

Мой код:

weatherDf <- data.frame() 

for(i in weatherData) { 
    # Get the airport code. 
    airport <- i$airport 

    # Get the date. 
    date <- as.POSIXct(as.numeric(as.character(i$timestamp))/1000, origin="1970-01-01", tz="UTC-1") 

    # Get the data in dailysummary only. 
    dailySummary <- i$dailysummary 

    weatherDf <- rbind(weatherDf, ldply(
     list(dailySummary), 
     function(x) c(airport, format(as.Date(date), "%Y-%m-%d"), x[["meanwindspdi"]], x[["meanwdird"]], x[["meantempm"]], x[["humidity"]]) 
    )) 
} 

Так как я могу убедиться, что эти ключевые условия ниже существуют в данных:

meanwindspdi 
meanwdird 
meantempm 
humidity 

Если любой из них не выходит, то игнорировать кучу их. Является ли это возможным?

EDIT:

Содержание weatherData в jsfiddle (я не могу разместить его здесь, поскольку это слишком долго, и я не знаю, где это лучшее место, чтобы показать данные публично R ...)

EDIT 2:

Я получаю ошибку, когда я пытаюсь экспортировать данные в формате TXT:

> write.table(weatherData,"/home/teelou/Desktop/data/data.txt",sep="\t",row.names=FALSE) 
Error in data.frame(date = list(pretty = "January 1, 1970", year = "1970", : 
    arguments imply differing number of rows: 1, 0 

Что это значит? Кажется, что есть некоторые ошибки в данном ...

EDIT 3:

Я экспортировал целые мои данные в .rdata к моему Google диск:

https://drive.google.com/file/d/0B_w5RSQMxtRSbjdQYWJMX3pfWXM/view?usp=sharing

Если вы используете RStudio, тогда вы можете просто импортировать данные.

EDIT 4:

target_names <- c("meanwindspdi", "meanwdird", "meantempm", "humidity") 

# If it has data then loop it. 
if (!is.null(weatherData)) { 
    # Initialize a data frame. 
    weatherDf <- data.frame() 

    for(i in weatherData) { 
     if (!all(target_names %in% names(i))) 
      next 

     # Get the airport code. 
     airport <- i$airport 

     # Get the date. 
     date <- as.POSIXct(as.numeric(as.character(i$timestamp))/1000, origin="1970-01-01", tz="UTC-1") 

     # Get the data in dailysummary only. 
     dailySummary <- i$dailysummary 

     weatherDf <- rbind(weatherDf, ldply(
      list(dailySummary), 
      function(x) c(airport, format(as.Date(date), "%Y-%m-%d"), x[["meanwindspdi"]], x[["meanwdird"]], x[["meantempm"]], x[["humidity"]]) 
     )) 
    } 

    # Rename column names. 
    colnames(weatherDf) <- c("airport", "key_date", "ws", "wd", "tempi", 'humidity') 

    # Convert certain columns weatherDf type to numberic. 
    columns <-c("ws", "wd", "tempi", "humidity") 
    weatherDf[, columns] <- lapply(columns, function(x) as.numeric(weatherDf[[x]])) 
} 

Осмотрите weatherDf:

> View(weatherDf) 
Error in .subset2(x, i, exact = exact) : subscript out of bounds 
+2

Попробуйте 'dput (head (weatherData, 50))' для шаринов g ваши данные. – nrussell

+0

@nrussell Я делюсь всеми своими данными в jsfiddle. см. мое редактирование выше. Благодарю. – laukok

+0

У меня нет ошибок при запуске вашего кода ??? – G5W

ответ

1

Вы можете использовать next, чтобы пропустить текущую итерацию цикла и перейти к следующей итерации:

target_names <- c("meanwindspdi", "meanwdird", "meantempm", "humidity") 

for(i in weatherData) { 
    if (!all(target_names %in% names(i))) 
    next 
    # continue with loop... 
+0

Спасибо за ответ. Но это больше не дает мне никаких данных ... см. Мое редактирование 4. У меня есть все мои данные, экспортированные в edit 3. – laukok

+1

@teelou Имена объектов, которые не присутствуют ни в одном из кадров данных в 'weatherData'. Поэтому все итерации пропускаются. –