2014-09-23 14 views
8

dataframe tek sütundaki değerleri Shift şöyleR: Böyle Örnek veriler 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)) 

: I yukarı z sütun tüm değerleri kayması istiyorum

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 

veri dizisinin geri kalanı değişmeden kalırken iki sıraya göre. sonuçta aşağıdaki gibi görünmelidir: Ben sadece aşağı bir sütunun değerlerini taşımak veya tüm dataframe bir değişen yollarını bulduk

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 

.

Herhangi bir fikrin var mı? Teşekkürler!

  • Drop bir vektör
  • Pad Basit bir işlevi ile yapabilirsiniz

sonunda NA arasında n değerleri ilk n unsurları:

+0

Olası yinelenen kullanarak başka çözüm: // stackoverflow.com/questions/25687727/shifting-a-column-down-by-one) – Chen

cevap

10

Senin sorunun için kolaylaştırır

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

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

Sonuç:

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

Veya 'c (kuyruk (x, -n), rep (NA, n))'. Bu sorunun bir çift kopyası çok kötü kokuyor ... –

+2

ama data.table çözümü nedir! – rawr

+0

@rawr, her zaman olduğu gibi keskin –

1

Ben iyi yinelenen bulamadık, bu yüzden burada (http [biri tarafından bir sütun küçültme] arasında 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