将行块的最小值附加为新列

Append Min values of Block of Rows as a new column

我有以下数据

head(datakurz)

Datum Abfluss       days
1 1968-01-01   0.681 1968-01-01
2 1968-01-02   0.610 1968-01-02
3 1968-01-03   0.610 1968-01-03
4 1968-01-04   0.790 1968-01-04
5 1968-01-05   0.904 1968-01-05
6 1968-01-06   3.720 1968-01-06
....
....
....

我想计算每 5 行的 min 值,所以基本上 (0.681,0.610,0.610,0.790,0.904) = 0.610

分钟

这是由我的函数完成的

Datum <- datad$days[1:100]
Abfluss <- datad$q[1:100]
datakurz <- data.frame(Datum, Abfluss)

datakurz$days <- as.Date(datakurz$Datum, format="%Y-%m-%d")
class(datakurz$days)

head(datakurz)

# Blöcke gleicher Größe (window size) und deren Minima berechnen

#minimum <- numeric(ws)

zaehler <-  nrow(datakurz) / 5 #Anzahl Zeilen Datensatz durch ws teilen -> Anzahl Blöcke
azeile <- 1
ezeile <- 5

for(i in 1:zaehler){
  minimum <- min(datakurz$Abfluss [azeile:ezeile])
  print(minimum)
  azeile <- azeile+5
  ezeile <- ezeile+5
}

这会生成以下输出

[1] 0.61 
[1] 0.828
[1] 0.681
[1] 1.41
[1] 0.79
[1] 0.904
[1] 0.828
[1] 0.718
[1] 0.904
[1] 0.79
[1] 0.944
[1] 1.03
[1] 0.866
[1] 1.07
[1] 1.07
[1] 1.25
[1] 0.944
[1] 0.828
[1] 0.79
[1] 1.07

所以基本上 0.61 是前 5 个值的最小值 0.828 是下一个块的最小值 auf 5 值等等...

现在我想将这些值作为列附加到数据框,但只是最小值。每块 5 个值的值(其余应为 null

期望的输出

Datum Abfluss       days         min
1 1968-01-01   0.681 1968-01-01  NULL
2 1968-01-02   0.610 1968-01-02  0.610
3 1968-01-03   0.610 1968-01-03  0.610
4 1968-01-04   0.790 1968-01-04  NULL
5 1968-01-05   0.904 1968-01-05  NULL
6 1968-01-06   3.720 1968-01-06  ...


谁能帮帮我?

如果您想继续使用 for 循环方法,您可以这样做:

zaehler <-  nrow(datakurz) / 5 
azeile <- 1
ezeile <- 5
datakurz$min <- NA

for(i in 1:zaehler){
  ind <- azeile:ezeile
  minimum <- min(datakurz$Abfluss[ind])
  datakurz$min[ind[datakurz$Abfluss[ind] == minimum]] <- minimum
  azeile <- azeile+5
  ezeile <- ezeile+5
}

然而,大多数时候您不必在 R 中显式使用 for 循环。例如,同样可以使用 dplyr 解决:

library(dplyr)

datakurz %>%
  group_by(grp = ceiling(row_number()/5)) %>%
  mutate(min = min(Abfluss), 
         min = replace(min, Abfluss != min, NA)) %>%
  ungroup %>%
  select(-grp) -> result

您可以使用 ave 找到一组 5 人的 min

D$min <- ave(D$q, (seq_len(nrow(D))-1) %/% 5, FUN=function(x)
 ifelse(x==min(x), x, NA))
D
#    q min
#1   1   1
#2   2  NA
#3   3  NA
#4   4  NA
#5   5  NA
#6   6   6
#7   7  NA
#8   8  NA
#9   9  NA
#10 10  NA
#11 11  11
#12 12  NA
#13 13  NA
#14 14  NA
#15 15  NA

数据:

D <- data.frame(q=1:15)