我想创建一个专栏" Y"它给出了特定列的下三行的最大值" X"在R的每一行。
e.g -
X Y
1 4 (4=max(2,3,4))
2 7 (7= max(3,4,7))
3 9 (9=max(4,7,9))
4
7
9
2
4
任何人都可以帮忙吗?
答案 0 :(得分:7)
假设:
x <- c(1, 2, 3, 4, 7, 9, 2, 4)
您可以查看embed
功能:
embed(x, 3)
# [,1] [,2] [,3]
# [1,] 3 2 1
# [2,] 4 3 2
# [3,] 7 4 3
# [4,] 9 7 4
# [5,] 2 9 7
# [6,] 4 2 9
请注意,它不是正确的长度,我们对第一行不感兴趣,所以让我们进行修改:
embed(c(x[-1], 0, 0, 0), 3)
# [,1] [,2] [,3]
# [1,] 4 3 2
# [2,] 7 4 3
# [3,] 9 7 4
# [4,] 2 9 7
# [5,] 4 2 9
# [6,] 0 4 2
# [7,] 0 0 4
# [8,] 0 0 0
从那里,它应该是一个简单的:
apply(embed(c(x[-1], 0, 0, 0), 3), 1, max)
# [1] 4 7 9 9 9 4 4 0
为方便起见,作为一个功能:
this_by_n <- function(invec, n = 3, pad_val = NA, FUN = sum) {
FUN <- match.fun(FUN)
apply(embed(c(invec[-1], rep(pad_val, n)), n), 1, {
function(x) if (all(is.na(x))) NA else FUN(x[!is.na(x)])
})
}
尝试一下:
this_by_n(x, 3, NA, mean)
this_by_n(x, 2, NA, max)
this_by_n(x, 4, NA, min)
答案 1 :(得分:1)
我们可以使用shift
中的data.table
和pmax
来执行此操作。
library(data.table)
do.call(pmax, c(shift(x, 1:3, type='lead'), na.rm=TRUE))
#[1] 4 7 9 9 9 4 4 NA
同样,pmin
每行提供min
值
do.call(pmin, c(shift(x, 1:3, type='lead'), na.rm=TRUE))
#[1] 2 3 4 2 2 2 4 NA
或mean
值,我们使用
rowMeans(do.call(cbind,shift(x, 1:3, type='lead')), na.rm=TRUE)
x <- c(1, 2, 3, 4, 7, 9, 2, 4)