2014-09-23 21 views
8

Uso esempio dati simili:R: trapezio valori in singola colonna di dataframe UP

example=data.frame(x=c(1,2,3,4,5,6,7,8), y=c(1,2,3,4,5,6,7,8), z=c(1,2,3,4,5,6,7,8)) 

che assomiglia a questo:

x y z 
1 1 1 1 
2 2 2 2 
3 3 3 3 
4 4 4 4 
5 5 5 5 
6 6 6 6 
7 7 7 7 
8 8 8 8 

desidero spostare tutti i valori nella colonna z alto da due righe mentre il resto del dataframe rimane invariato. Il risultato dovrebbe essere simile a questo:

x y z 
1 1 1 3 
2 2 2 4 
3 3 3 5 
4 4 4 6 
5 5 5 7 
6 6 6 8 
7 7 7 NA 
8 8 8 NA 

ho trovato solo modi per spostare i valori di una colonna verso il basso, o di uno spostamento di tutta la dataframe.

Qualche idea? Grazie!

+0

Eventuali duplicati di [Spostando una colonna verso il basso da una] (http: // stackoverflow.com/questions/25687727/shifting-a-column-down-by-one) – Chen

risposta

10

Il tuo problema si semplifica in:

  • goccia primi n elementi in un vettore
  • Pad n valori NA alla fine

si può fare questo con una semplice funzione:

shift <- function(x, n){ 
    c(x[-(seq(n))], rep(NA, n)) 
} 

example$z <- shift(example$z, 2) 

Il risultato:

example 
    x y z 
1 1 1 3 
2 2 2 4 
3 3 3 5 
4 4 4 6 
5 5 5 7 
6 6 6 8 
7 7 7 NA 
8 8 8 NA 
+0

Oppure 'c (tail (x, -n), rep (NA, n))'. Questa domanda ha un cattivo odore di un duplicato ... –

+2

ma qual è la soluzione data.table! – rawr

+0

@rawr, nitido come sempre :) –

1

non riuscivo a trovare un buon duplicato, quindi ecco un'altra soluzione utilizzando length<-

shift2 <- function(x, n) `length<-`(tail(x, -n), length(x)) 
# or just shift2 <- function(x, n) c(tail(x, -n), rep(NA, n)) 
transform(example, z = shift2(z, 2)) 
# x y z 
# 1 1 1 3 
# 2 2 2 4 
# 3 3 3 5 
# 4 4 4 6 
# 5 5 5 7 
# 6 6 6 8 
# 7 7 7 NA 
# 8 8 8 NA 
0
example = tibble(x=c(1,2,3,4,5,6,7,8), 
        y=c(1,2,3,4,5,6,7,8), 
        z=c(1,2,3,4,5,6,7,8)) 

example %>% mutate_at(c("z"), funs(lead), n = 2) 

# A tibble: 8 x 3 
     x  y  z 
    <dbl> <dbl> <dbl> 
1 1.00 1.00 3.00 
2 2.00 2.00 4.00 
3 3.00 3.00 5.00 
4 4.00 4.00 6.00 
5 5.00 5.00 7.00 
6 6.00 6.00 8.00 
7 7.00 7.00 NA 
8 8.00 8.00 NA 
Problemi correlati