2014-09-23 26 views
8

Sử dụng dữ liệu ví dụ như thế này:R: Shift giá trị trong cột duy nhất của 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)) 

mà trông như thế này:

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 

Tôi muốn chuyển tất cả các giá trị trong cột z trở lên bởi hai hàng trong khi phần còn lại của khung dữ liệu vẫn không thay đổi. Kết quả sẽ giống như thế này:

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 

tôi chỉ tìm thấy cách để di chuyển các giá trị của một cột xuống, hoặc chuyển dịch của toàn dataframe.

Bất kỳ ý tưởng nào? Cảm ơn!

+0

có thể trùng lặp của [Chuyển một cột xuống bởi một] (http: // stackoverflow.com/questions/25687727/shifting-a-column-down-by-one) – Chen

Trả lời

10

Vấn đề của bạn đơn giản hoá để:

  • Thả n yếu tố đầu tiên trong một vector
  • Pad n giá trị của NA ở cuối

Bạn có thể làm điều này với một chức năng đơn giản:

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

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

Kết quả:

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

Hoặc 'c (đuôi (x, -n), đại diện (NA, n))'. Câu hỏi này có một mùi rất xấu của một bản sao ... –

+2

nhưng giải pháp data.table là gì! – rawr

+0

@rawr, sắc nét như mọi khi :) –

1

tôi không thể tìm thấy một bản sao tốt, vì vậy đây là một giải pháp sử dụng 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 
Các vấn đề liên quan