我想创建一个函数,它可以找到一个向量连续增加k次的组件。
也就是说,如果设想的功能是f(x,k)
和x=c(2,3,4,3,5,6,5,7)
,那么
f(x,1)
的值为2,3,3,5,5
,因为只有x
的这些组件增加了一倍。
此外,如果k=2
,则f(x,2)
的值为2,3
,因为只有这些组件连续增加2倍。(2→3→4和3→5→6 )
我想我应该使用像for
这样的重复语法来实现这个目的。
答案 0 :(得分:2)
1)使用动物园套餐中的rollapply
:
library(zoo)
f <- function(x, k)
x[rollapply(x, k+1, function(x) all(diff(x) > 0), align = "left", fill = FALSE)]
现在测试f
:
x <- c(2,3,4,3,5,6,5,7)
f(x, 1)
## [1] 2 3 3 5 5
f(x, 2)
## [1] 2 3
f(x, 3)
## numeric(0)
1a)此变体略短,也有效:
f2 <- function(x, k) head(x, -k)[ rollapply(diff(x) > 0, k, all) ]
2)以下是不使用软件包的1a版本:
f3 <- function(x, k) head(x, -k)[ apply(embed(diff(x) > 0, k), 1, all) ]
答案 1 :(得分:0)
我不太明白你问题的第二部分(k = 2)但是第一部分你可以使用这样的东西:
test<-c(2,3,4,3,5,6,5,7) #Your vector
diff(test) #Differentiates the vector
diff(test)>0 #Turns the vector in a logical vector with criterion >0
test[diff(test)>0] #Returns only the elements of test that correspond to a TRUE value in the previous line