【问题标题】:Append Min values of Block of Rows as a new column将 Block of Rows 的 Min 值附加为新列
【发布时间】:2021-03-02 19:04:09
【问题描述】:

我有以下数据

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  ...


谁能帮帮我?

【问题讨论】:

    标签: r for-loop append min


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

      如果您想继续使用 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
      

      【讨论】:

      • 非常感谢,我收到以下错误Error in $(*tmp*, "min", value = c(NA, 0.61, 0.61)) : replacement has 3 rows, data has 100 &gt;
      • 但是 dpylr 解决方案有帮助!谢谢
      猜你喜欢
      • 1970-01-01
      • 2016-06-21
      • 2019-05-13
      • 2018-07-15
      • 1970-01-01
      • 2014-09-06
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多