0

我想在两个或多个间隙中使用最后一个观察结果(locf)或下一个观察结果向后(nocb)来估算缺失值。

为了确定填充缺失值的方向(上/下),对数据框中的第一列(间隔​​)进行加权。插值(locf/nocb)应该从最小值结束(对应于向外的 NAs 行的间隔值)。默认的 fillna 是 locf。

示例:异常 nafill 的逻辑:在 ID2 列第 5-7 行(包括标题)中,方向将为 nocb,因为 (Interval[7,] value= 50) 小于 Interval[5,] value=100。

尝试使用df1 <-df %>%fill(ID1, ID2, ID3,which.min(Interval)) %>% #default direction down fill(ID1, ID2, ID3, .direction = "up",which.min(Interval)) aint 工作,请协助更正或建议另一种有效的 R 解决方案。预先感谢您的帮助。

输入

df = data.frame(
             Interval = c(0,20,80,100,50,50,130,100,70,80,200), 
             ID1 = c(0,1,1,0,NA,NA,NA,NA,1,NA,1), 
             ID2 = c(1,0,0,NA,NA,NA,1,1,3,NA,1), 
             ID3 = c(1,NA,1,0,3,NA,NA,NA,1,NA,1) 
)

Interval    ID1 ID2 ID3
0   0   1   1
20  1   0   NA
80  1   0   1
100 0   NA  0
50  NA  NA  3
50  NA  NA  NA
130 NA  1   NA
100 NA  1   NA
70  1   3   1
80  NA  NA  NA
200 1   1   1

预期产出

Interval    ID1 ID2 ID3
0   0   1   1
20  1   0   NA
80  1   0   1
100 0   1   0
50  0   1   3
50  0   1   3
130 0   1   3
100 0   1   3
70  1   3   1
80  NA  NA  NA
200 1   1   1

4

1 回答 1

0

目前尚不清楚您的第一列是做什么的。您的第二个预期列是 和 的混合locfnocb但是您可以nafill逐列使用标准:

library(data.table)
apply(df, 2, function(j) {nafill(j, type = "locf")})

根据您的评论,如果您想nafill依赖df$Interval您可以索引您的df使用:

StartIndex <- apply(df[,2:dim(df)[2]], 2, function(j) {
  which(diff(is.na(j)) == 1 ) + 1})
EndIndex <- apply(df[,2:dim(df)[2]], 2, function(j) {
  which(diff(is.na(j)) == -1) })

并指示开始和结束df$Interval是增加还是减少:

lapply(1:(dim(df)[2]-1), function(i) {
  lapply(1:length(StartIndex[[i]]), function(j) {
    range <- c(StartIndex[[i]][j], EndIndex[[i]][j])
    if (range[1] != range[2]) {
      df$Interval[range[1]] - df$Interval[range[2]]
    }
  })
})
于 2020-04-13T07:04:07.423 回答