2013-05-24 3 views
5

Format moim pliku danych programu Excel jest:Dodawanie brakujących rzędów

day     value 
01-01-2000 00:00:00 4 
01-01-2000 00:01:00 3 
01-01-2000 00:02:00 1 
01-01-2000 00:04:00 1 

otwieram plik z tym:

ts = read.csv(file=pathfile, header=TRUE, sep=",") 

Jak mogę dodać dodatkowe wiersze z numerem zerowym w kolumnie „wartość” do ramki danych. Przykładem wyjściowa:

day     value 
01-01-2000 00:00:00 4 
01-01-2000 00:01:00 3 
01-01-2000 00:02:00 1 
01-01-2000 00:03:00 0 
01-01-2000 00:04:00 1 

Odpowiedz

1

Spróbuj:

ts = read.csv(file=pathfile, header=TRUE, sep=",", stringsAsFactors=F) 
ts.tmp = rbind(ts,list("01-01-2000 00:03:00",0)) 
ts.out = ts.tmp[order(ts.tmp$day),] 

Zauważ, że trzeba wymusić załadowanie sznurki w pierwszej kolumnie jako czynniki charakter, a nie inaczej będziesz mieć problem z rbind. Aby dostać się do kolumny dzień być czynnikiem po niż po prostu zrobić:

ts.out$day = as.factor(ts.out$day) 
3

myślę, że to jest bardziej ogólne rozwiązanie, które polega na tworzeniu sekwencji wszystkich znaczników czasu, wykorzystując, że jako podstawę dla nowej ramki danych , a następnie wypełnianie oryginalnych wartości w tym pliku df, o ile ma to zastosowanie.

# convert original `day` to POSIX 
ts$day <- as.POSIXct(ts$day, format="%m-%d-%Y %H:%M:%S", tz="GMT") 

# generate a sequence of all minutes in a day 
minAsNumeric <- 946684860 + seq(0,60*60*24,by=60) # all minutes of your first day 
minAsPOSIX <- as.POSIXct(minAsNumeric, origin="1970-01-01", tz="GMT") # convert those minutes to POSIX 

# build complete dataframe 
newdata <- as.data.frame(minAsPOSIX) 
newdata$value <- ts$value[pmatch(newdata$minAsPOSIX, ts$day)] # fill in original `value`s where present 
newdata$value[is.na(newdata$value)] <- 0 # replace NAs with 0 
3

Jest teraz całkowicie zautomatyzowany w pakiecie padr. Wykonuje tylko jedną linię kodu.

original <- data.frame(
    day = as.POSIXct(c("01-01-2000 00:00:00", 
        "01-01-2000 00:01:00", 
        "01-01-2000 00:02:00", 
        "01-01-2000 00:04:00"), format="%m-%d-%Y %H:%M:%S"), 
    value = c(4, 3, 1, 1)) 

library(padr) 
library(dplyr) # for the pipe operator 
original %>% pad %>% fill_by_value(value) 

Zobacz vignette("padr") lub this blogu dla jego pracy.