2016-09-14 1 views
2

Ich möchte eine bestehende Vektorgröße n machen und NA verwenden. Ich weiß, ich kann Pad am Ende des Vektors in etwa so:Wie kann ich einen Vektor mit NA von vorne auffüllen?

v1 <- 1:10 
v2 <- diff(v1) 
length(v2) <- length(v1) 
v2 
# 1 1 1 1 1 1 1 1 1 NA 

Aber ich will in eine generic Weise die NA am beginnning statt füllen. Ich meine, für dieses spezielle Beispiel kann ich nur

v2 <- c(NA, diff(v1)) 
# NA 1 1 1 1 1 1 1 1 1 

Aber ich hatte gehofft, dass es eine gewisse Basis R-Funktion oder Bibliothek vorhanden sind, die so etwas wie v2 <- pad(v2, n=length(v1), value=NA)

Gibt es so etwas sieht ich das selbst verwenden aus oder muss ich meine eigene Funktion definieren:

pad <- function(x, n) { # ugly function that doesn't keep the attributes of x 
    len.diff <- n - length(x) 
    c(rep(NA, len.diff), x) 
} 

pad(1:10, 12) # NA NA 1 2 3 4 5 6 7 8 9 10 
+0

Ich glaube nicht, dass Ihre Funktion hässlich ist. – nicola

+0

Ich glaube nicht, dass deine Funktion auch hässlich ist. Warum nicht n = 1 setzen und dann haben Sie Ihr Problem gelöst. – user1945827

+1

Für "NA" Padding können Sie auch 'v1 <- 1:10; v2 <- diff (v1); Länge (v2) <- Länge (v1); v2 [order (! is.na (v2))] ' –

Antwort

2

v1 Nimmt man die gewünschte Länge und v2 kürzer (oder die gleiche Länge haben) diese nach links pad v2 mit NA Werte auf die Länge des v1. Die ersten vier nehmen numerische Vektoren an, obwohl sie modifiziert werden können, um auch allgemeiner zu funktionieren, indem NA*v1 in dem Code durch rep(NA, length(v1)) ersetzt wird.

replace(NA * v1, seq(to = length(v1), length = length(v2)), v2) 

rev(replace(NA * v1, seq_along(v2), rev(v2))) 

replace(NA * v1, seq_along(v2) + length(v1) - length(v2), v2) 

tail(c(NA * v1, v2), length(v1)) 

c(rep(NA, length(v1) - length(v2)), v2) 

Die vierte ist die kürzeste. Die ersten zwei und vierten beinhalten keine expliziten arithmetischen Berechnungen außer der Multiplikation von v1 mit NA Werten. Die zweite ist wahrscheinlich langsam, da sie zwei Anwendungen von rev umfasst.

4

Eine Option ist diff von zoo, die auch die na.pad

haben
library(zoo) 
as.vector(diff(zoo(v1), na.pad=TRUE)) 
#[1] NA 1 1 1 1 1 1 1 1 1 
+0

Dies ist perfekt in meinem Beispiel, da ich ein diff mache, aber es beantwortet nicht das allgemeinere Problem des Auffüllens eines vorhandenen Vektors 'v2' mit derselben Größe wie' v1'. (Stellen Sie sich vor, dass ich 'diff()' an erster Stelle nicht verwendete) – ecerulm

+1

@ecerulm Ihre Funktion ist auch gut. Eine andere Variation ist c (rep (NA, sum (is.na) ("Länge <-" (v2, Länge (v1)))), v2) ' – akrun

0

definieren nrValues ​​als die Anzahl der Elemente, die Sie zu Beginn v2 wollen könnten Sie:

n <- length(v1) v2 <- c(rep(NA,nrValues),v1[nrValues:n])

ich mit einer Funktion nicht vertraut bin, dass dies der Fall ist, so dass, wenn Sie zu tun beabsichtigen Ich würde es mehrmals selbst erstellen.

Verwandte Themen