r - 修改向量以仅包含升序元素

标签 r vector zoo

我有一个要修改的向量,以便它只包含与前一个元素相等或大于前一个元素的元素。该向量表示一种现象,该现象应该只会增加或保持不变(即按天计算的累计死亡人数),但报告错误会导致元素少于前一个元素。我想通过用以前的元素替换元素来纠正这个问题,直到向量满足上述条件。

原始数据:1 3 3 6 8 10 7 9 15 12

需要修改的数据:1 3 3 6 6 6 7 9 9 12

library(zoo)
raw <- c(1, 3, 3, 6, 8, 10, 7, 9, 15, 12) 

replace.errors <- function(x){   
x %>% 
replace(diff(x) < 0, NA) %>%
na.locf(na.rm=FALSE)
}

replace.errors(raw)

# [1]  1  3  3  6  8  8  7  9  9 12

如果需要替换一行中的多个顺序元素(8 和 10),我的函数将不起作用,因为它只是向前拉一个仍然大于下一个元素的元素。

最佳答案

data.table 选项使用 nafillcummin

nafill(replace(raw, rev(cummin(rev(raw))) != raw, NA), type = "locf")

给予

> nafill(replace(raw, rev(cummin(rev(raw))) != raw, NA), type = "locf")
 [1]  1  3  3  6  6  6  7  9  9 12

按照上述方法的类似想法,您的函数 replace.errors 可以定义为

replace.errors <- function(x){   
  x %>%
    replace(rev(cummin(rev(.))) != (.), NA) %>%
    na.locf()
}

这样

> replace.errors(raw)
 [1]  1  3  3  6  6  6  7  9  9 12

另一种选择是像下面这样定义一个用户函数

f <- function(v) {
  for (k in which(c(FALSE, diff(v) < 0))) {
    p <- max(v[v < v[k]])
    v <- replace(v, tail(which(v == p), 1):(k - 1), p)
  }
  v
}

给出

> f(raw)
 [1]  1  3  3  6  6  6  7  9  9 12

关于r - 修改向量以仅包含升序元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65649241/

相关文章:

r - 计算每 n 行相对于每组条件的斜率

c++ - 在 C++ 中通过引用修改此操作的开销是多少?

C++ - 以特定方式对 vector 中的字符串进行排序

r - "dimnames_zoo"未从当前命名空间 (xts) 解析

r - 从相关矩阵生成协方差矩阵

r - 将点添加到配对图中?

arrays - 命名数组的一维

c++ - 如何使用 mmap 创建共享 std::vector<std::string>?

r - 获取与 7 天前日期 'Around' 相关的分数

r - 在 R 中通过 ID 进行最后的观察