将行块的最小值附加为新列
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)
我有以下数据
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)