用已建立的值填充时间序列,如果尚未找到值,则保留 NA
Fill Timeseries with founded values or keep NA if no value was found yet
我有一个较长的 TimeSeries 并为了预测目的将其变宽,目前时间序列具有以下结构:
Day
Value
Strength1
Strength2
Strength3
1/2
1.356
3
NA
NA
2/2
1.385
NA
NA
NA
3/2
1.385
NA
1.01
NA
4/2
1.4
NA
NA
10
5/2
1.6
NA
NA
NA
6/2
1.7
4
NA
NA
7/2
1.8
NA
1.05
NA
8/2
1.88
NA
NA
NA
9/2
1.98
NA
NA
11
10/2
1.8
NA
NA
NA
我想要一个函数:
- 给定一个时间序列
- 如果单元格 == NA 并且
以前只在列中找到 NA,保留 NA
- if cell != NA 好
- if cell == NA 但之前我们没有找到NA值,改成之前找到的值
这将是结果:
Day
Value
Strength1
Strength2
Strength3
1/2
1.356
3
NA
NA
2/2
1.385
3
NA
NA
3/2
1.385
3
1.01
NA
4/2
1.4
3
1.01
10
5/2
1.6
3
1.01
10
6/2
1.7
4
1.01
10
7/2
1.8
4
1.05
10
8/2
1.88
4
1.05
10
9/2
1.98
4
1.05
11
10/2
1.8
4
1.05
11
我试过这个功能,但不对:
filler <- function(df) {
col <- colnames(df)
one <- NA
for (i in col) {
for (a in i) {
if(!is.na(a)) {
one = a
}
if(!is.na(one) & is.na(a)) {
a = one
}
}
}
}
您可以使用 tidyr::fill
-
filler <- function(data) tidyr::fill(data, dplyr::everything())
filler(df)
# Day Value Strength1 Strength2 Strength3
#1 1/2 1.356 3 NA NA
#2 2/2 1.385 3 NA NA
#3 3/2 1.385 3 1.01 NA
#4 4/2 1.400 3 1.01 10
#5 5/2 1.600 3 1.01 10
#6 6/2 1.700 4 1.01 10
#7 7/2 1.800 4 1.05 10
#8 8/2 1.880 4 1.05 10
#9 9/2 1.980 4 1.05 11
#10 10/2 1.800 4 1.05 11
我有一个较长的 TimeSeries 并为了预测目的将其变宽,目前时间序列具有以下结构:
Day | Value | Strength1 | Strength2 | Strength3 |
---|---|---|---|---|
1/2 | 1.356 | 3 | NA | NA |
2/2 | 1.385 | NA | NA | NA |
3/2 | 1.385 | NA | 1.01 | NA |
4/2 | 1.4 | NA | NA | 10 |
5/2 | 1.6 | NA | NA | NA |
6/2 | 1.7 | 4 | NA | NA |
7/2 | 1.8 | NA | 1.05 | NA |
8/2 | 1.88 | NA | NA | NA |
9/2 | 1.98 | NA | NA | 11 |
10/2 | 1.8 | NA | NA | NA |
我想要一个函数:
- 给定一个时间序列
- 如果单元格 == NA 并且 以前只在列中找到 NA,保留 NA
- if cell != NA 好
- if cell == NA 但之前我们没有找到NA值,改成之前找到的值
这将是结果:
Day | Value | Strength1 | Strength2 | Strength3 |
---|---|---|---|---|
1/2 | 1.356 | 3 | NA | NA |
2/2 | 1.385 | 3 | NA | NA |
3/2 | 1.385 | 3 | 1.01 | NA |
4/2 | 1.4 | 3 | 1.01 | 10 |
5/2 | 1.6 | 3 | 1.01 | 10 |
6/2 | 1.7 | 4 | 1.01 | 10 |
7/2 | 1.8 | 4 | 1.05 | 10 |
8/2 | 1.88 | 4 | 1.05 | 10 |
9/2 | 1.98 | 4 | 1.05 | 11 |
10/2 | 1.8 | 4 | 1.05 | 11 |
我试过这个功能,但不对:
filler <- function(df) {
col <- colnames(df)
one <- NA
for (i in col) {
for (a in i) {
if(!is.na(a)) {
one = a
}
if(!is.na(one) & is.na(a)) {
a = one
}
}
}
}
您可以使用 tidyr::fill
-
filler <- function(data) tidyr::fill(data, dplyr::everything())
filler(df)
# Day Value Strength1 Strength2 Strength3
#1 1/2 1.356 3 NA NA
#2 2/2 1.385 3 NA NA
#3 3/2 1.385 3 1.01 NA
#4 4/2 1.400 3 1.01 10
#5 5/2 1.600 3 1.01 10
#6 6/2 1.700 4 1.01 10
#7 7/2 1.800 4 1.05 10
#8 8/2 1.880 4 1.05 10
#9 9/2 1.980 4 1.05 11
#10 10/2 1.800 4 1.05 11