R rbind - numbers of columns of arguments do not match

laukok picture laukok · Jan 17, 2017 · Viewed 8.2k times · Source

How can I ignore a data set if some column names don't exist in it?

I have a list of weather data from a stream but I think certain key weather conditions don't exist and therefore I have this error below with rbind:

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

My code:

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"]])
    ))
}

So how can I make sure these key conditions below exist in the data:

meanwindspdi
meanwdird
meantempm
humidity

If any of them does not exit, then ignore the bunch of them. Is it possible?

EDIT:

The content of weatherData is in jsfiddle (I can't post it here as it is too long and I dunno where is the best place to show the data publicly for R...)

EDIT 2:

I get some error when I try to export the data into a 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

What does it mean? It seems that there are some errors in the data...

EDIT 3:

I have exported my entire data in .RData to my google drive:

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

If you use RStudio, then you can just import the data.

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]]))
}

Inspect the weatherDf:

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

Answer

Sven Hohenstein picture Sven Hohenstein · Jan 17, 2017

You can use next to skip the current iteration of the loop and go to the next iteration:

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

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