我已经找到了高低的答案。看起来很简单,但我正努力让任何事情发挥作用。
在Win 7中使用R 3.0。
我正在寻找一种方法来找到最大值(逐行):感兴趣的行,之前的行和之后的行。
一个例子看起来像这样:
x max
1 1 NA
2 7 7
3 3 7
4 4 5
5 5 5
我可以通过循环执行此操作,但我希望尽可能避免这种情况。我已经探讨了类似于rowSums
和rollmean
的内容,但是它们并不适合这个法案,因为我想在它之后的行中有最大值。
非常感谢任何想法!
答案 0 :(得分:3)
您可以在基地R中使用embed
和pmax
。
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)