使用 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' 的 diff
erence,rep
licate 两次(或 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
我有这样的数据
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' 的 diff
erence,rep
licate 两次(或 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