无法在网上找到与此相似的内容,这是我一直在努力解决的看似简单的数据操作问题。我创建了一个看起来如此的距离矢量:
distances = c(3, 5, 7, 9, 2.3, 5.2, 1.8, 2.3, 9, 0.75, 14, 11, 4.4, 12, 13)
距离永远是一个长度为5的倍数的向量,在我的情况下长度(距离)== 15.我试图获得这个:
output = c(2.3, 0.75, 4.4)
这里,2.3是前5个元素的最小值,0.75是元素6:10的最小值,4.4是元素11:15的最小值。这感觉它适用于应用功能,但我不太熟悉它们。任何帮助表示赞赏!
答案 0 :(得分:4)
这里有一些可能性:
1)apply / matrix 形成一个矩阵,其中包含5行distances
逐列出矢量列,然后取每列的最小值:
apply(matrix(distances, 5), 2, min)
## [1] 2.30 0.75 4.40
2)zoo :: rollapply 另一种方法是使用动物园包中的rollapply
,指定我们希望每5个元素中最少使用5个元素并跳过5到下一个元素重复5个元素。
library(zoo)
rollapply(distances, 5, by = 5, min)
## [1] 2.30 0.75 4.40
3)tapply / gl 由于长度(距离)/ 5 = 15/5 = 3组,每个长度为5:
tapply(distances, gl(3, 5), min)
## 1 2 3
## 2.30 0.75 4.40
4)tapply / col 这类似于(3);但是,取代gl
代替col(matrix(...))
使用来自(1)的matrix
想法:
tapply(distances, col(matrix(distances, 5)), min)
## 1 2 3
## 2.30 0.75 4.40