为R中的每一行中的行之前的行找到值的最大值

时间:2014-02-19 20:44:39

标签: r

我已经找到了高低的答案。看起来很简单,但我正努力让任何事情发挥作用。

在Win 7中使用R 3.0。

我正在寻找一种方法来找到最大值(逐行):感兴趣的行,之前的行和之后的行。

一个例子看起来像这样:

   x  max
1  1   NA
2  7    7
3  3    7
4  4    5
5  5    5

我可以通过循环执行此操作,但我希望尽可能避免这种情况。我已经探讨了类似于rowSumsrollmean的内容,但是它们并不适合这个法案,因为我想在它之后的行中有最大值。

非常感谢任何想法!

3 个答案:

答案 0 :(得分:3)

您可以在基地R中使用embedpmax

d <- data.frame(x=c(1,7,3,4,5))
transform(d, max=c(NA, do.call(pmax, as.data.frame(embed(d$x, 3))), NA))
#   x max
# 1 1  NA
# 2 7   7
# 3 3   7
# 4 4   5
# 5 5  NA

答案 1 :(得分:3)

这是使用dplyr的lead()lag()函数的方法:

library(dplyr)

d <- data.frame(x = c(1,7,3,4,5))
mutate(d, max = pmax(lead(x), x, lag(x)))
#>   x max
#> 1 1  NA
#> 2 7   7
#> 3 3   7
#> 4 4   5
#> 5 5  NA

答案 2 :(得分:1)

假设您要为矩阵而不是向量(对向量使用rollapply)执行此操作,这是一个简单的解决方案,可能不是最好的速度:

library(Hmisc)
x <- matrix(runif(10), ncol=2)
rowMaxs  <- apply(x, 1, max)

row3Maxs <- apply(cbind(rowMaxs, 
                        Lag(rowMaxs, 1), 
                        Lag(rowMaxs, -1)), 1, max)

cbind(x, row3Maxs)

然而从性能角度来看,以下情况可能更好:

row3Maxsc <- c(NA, 
          sapply(2:(length(rowMaxs)-1), 
                 function(i)
                   max(rowMaxs[i], rowMaxs[i-1], rowMaxs[i+1])
                 ),
          NA)
cbind(x, row3Maxs)