使用 R 中的 head 和 tail 函数获取行中的差异

Taking the differences in rows using head and tail functions in R

我有这样的数据

id Pos
1    1
2    10
3    4
4    2
5    3
6    16

我想要做的是以 id 为条件的 Pos 行之间的差异。如果id是奇数,那么差就是1-10=-9。如果id为偶数,则相差10-1=9.

所以我应该得到

difference
-9
9
2
-2
-13
13

我试过了

q <- ifelse( (id %% 1) == 0,(tail(Pos, -1) - head(Pos, -1)), (head(Pos, -1) - tail(Pos, -1)) )

但它只对赔率有效。

知道如何在 R 中执行此操作吗?

干杯

居纳尔

一个选项是用 gl 为每两个元素创建一个组,取 'Pos' 的 difference,replicate 两次(或 n()), 并根据 odd/even row_number()

更改符号
library(dplyr)
df1 %>% 
    group_by(grp = as.integer(gl(n(), 2, n()))) %>% 
    mutate(Diff = rep(diff(Pos), n())) %>% 
    ungroup %>% 
    select(-grp) %>%
    mutate(Diff =  Diff * c(1, -1)[(id %%2) + 1])
# A tibble: 6 x 3
#     id   Pos  Diff
#  <int> <int> <dbl>
#1     1     1    -9
#2     2    10     9
#3     3     4     2
#4     4     2    -2
#5     5     3   -13
#6     6    16    13

如果我们需要 head/tail 来自 base R

的解决方案
i1 <-  with(df1, rep((tail(Pos, -1) - head(Pos, -1))[c(TRUE, FALSE)], each = 2))    
c(1, -1)[(df1$id %%2) + 1] * i1
#[1]  -9   9   2  -2 -13  13

数据

df1 <-  structure(list(id = 1:6, Pos = c(1L, 10L, 4L, 2L, 3L, 16L)), 
  class = "data.frame", row.names = c(NA, 
-6L))

这是一个基本解决方案:

i <- seq(from = 1,to = nrow(DF), by = 2)
DF$difference <- rep(DF$Pos[i] - DF$Pos[i+1], each = 2)
DF$difference[i+1] <- DF$difference[i+1] * -1

DF

  id Pos difference
1  1   1         -9
2  2  10          9
3  3   4          2
4  4   2         -2
5  5   3        -13
6  6  16         13