2014-09-23 12 views
8

z przykładową danych tak:R: przesunięcie wartości w jednej kolumnie 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)) 

która wygląda następująco:

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 

ja jak przeniesienie wszystkich wartości z kolumny Z górę o dwa rzędy, podczas gdy reszta ramki danych pozostaje niezmieniona. Wynik powinien wyglądać następująco:

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 

ja tylko znaleźć sposoby, aby przenieść wartości kolumny w dół, lub przesunięcie całego dataframe.

Wszelkie pomysły? Dzięki!

+0

Możliwa duplikat [Przesunięcie kolumny w dół o jedną] (http: // stackoverflow.com/questions/25687727/shifting-a-column-down-by -one) – Chen

Odpowiedz

10

Twój problem upraszcza się do:

  • upuść pierwsze n elementów w wektorze
  • Pad n wartości NA na koniec

Można to zrobić za pomocą prostej funkcji:

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

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

Rezultat:

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

Lub 'c (ogon (x, -n), rep (NA, n))'. To pytanie ma bardzo nieprzyjemny zapach duplikatu ... –

+2

, ale jakie jest rozwiązanie data.table! – rawr

+0

@rawr, ostry jak zawsze :) –

1

nie mogłem znaleźć dobrego duplikat, tak oto kolejny rozwiązanie wykorzystujące 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 
Powiązane problemy