2013-01-17 47 views
-4

我想創建兩個名爲preypreyrow的新列。 prey是下一個位置y的值,但是在相同的x的值內。並且preyrow的值是下一個位置row的值,與x的值相同。數據操作問題

原始表如下:

x   y row 
1 1 0.60697546 1 
2 1 -0.68600911 2 
3 1 -0.53499454 3 
4 1 0.05591587 4 
5 2 0.11937963 5 
6 2 -0.39951846 6 
7 2 0.97430697 7 
8 3 0.42852135 8 
9 3 0.27695563 9 
10 4 -0.29530769 10 

我想輸出表的樣子:

x   y row  prey prerow 
1 1 0.60697546 1 -0.68600911  2 
2 1 -0.68600911 2 -0.53499454  3 
3 1 -0.53499454 3 0.05591587  4 
4 1 0.05591587 4   NA  NA 
5 2 0.11937963 5 -0.39951846  6 
6 2 -0.39951846 6 0.97430697  7 
7 2 0.97430697 7   NA  NA 
8 3 0.42852135 8 0.27695563  9 
9 3 0.27695563 9 -0.29530769  10 
10 4 -0.29530769 10   NA  NA 
+3

計算獵物和預行列的邏輯是什麼,爲什麼有些是NA? – Allen

回答

2

我覺得這是你需要什麼(使用data.table):

require(data.table) 
df <- structure(list(x = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 4L), 
     y = c(0.60697546, -0.68600911, -0.53499454, 0.05591587, 0.11937963, 
     -0.39951846, 0.97430697, 0.42852135, 0.27695563, -0.29530769), 
     row = 1:10), .Names = c("x", "y", "row"), class = "data.frame", 
     row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10")) 
dt <- data.table(df, key="x") 
dt.out <- dt[, .SD[2:(nrow(.SD)+1)], by=x] 
setnames(dt.out, c("x", "prey", "preyrow")) 
dt.out <- cbind(dt, subset(dt.out, select=-c(x))) 

> dt.out 

    x   y row  prey preyrow 
1: 1 0.60697546 1 -0.68600911  2 
2: 1 -0.68600911 2 -0.53499454  3 
3: 1 -0.53499454 3 0.05591587  4 
4: 1 0.05591587 4   NA  NA 
5: 2 0.11937963 5 -0.39951846  6 
6: 2 -0.39951846 6 0.97430697  7 
7: 2 0.97430697 7   NA  NA 
8: 3 0.42852135 8 0.27695563  9 
9: 3 0.27695563 9   NA  NA 
10: 4 -0.29530769 10   NA  NA