用 R 列中的下一个非零值替换 0

标签 r replace fill

其他人给了我一个看起来有点像这样的数据集。

input = c(0,0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,2)

我需要做的是用下一个非零数字填充 0(它总是 1 或 2)。此外,下一个非零数字需要填充为下一个(最后一个值可以是任何值,因为无论如何我都会将其设置为 NA)。

所以函数应该返回这个

> output =c(1,1,1,1,2,2,2,2,2,2,2,1,1,2,2,2,NA)
> cbind(input,output)
      input output
 [1,]     0      1
 [2,]     0      1
 [3,]     0      1
 [4,]     0      1
 [5,]     1      2
 [6,]     0      2
 [7,]     0      2
 [8,]     0      2
 [9,]     0      2
[10,]     0      2
[11,]     0      2
[12,]     2      1
[13,]     0      1
[14,]     1      2
[15,]     0      2
[16,]     0      2
[17,]     2     NA

谢谢!

-- 编辑部分--

输出只需是一个数组/向量(或者 R 中的任何专有术语)。我将 2 绑定(bind)在一起的示例演示了 1 的偏移量以及填充。感谢大家的精彩回答

最佳答案

output=input[!!input][cumsum(!!input)+1]
#[1]  1  1  1  1  2  2  2  2  2  2  2  1  1  2  2  2 NA

我们利用 R 如何将数字强制转换为逻辑值。 as.logical(0:2) 将返回 FALSE TRUE TRUE。零变为 FALSE,其他数字被视为 TRUE。将否定感叹号放在 input 前面将其强制转换为逻辑。我本可以写成 as.logical(input),这只是节省几次击键的技巧。因此,我们使用该逻辑索引通过 input[!!input] 对非零值进行子集化。逻辑索引 cumsum(!!input)+1 的累积和创建了一种快速的方法来在您添加一个变化点时对变化点进行索引。它有助于单独运行每个部分。

关于用 R 列中的下一个非零值替换 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31394630/

相关文章:

r - 在ggplot中绘制 "known"点的模拟覆盖范围

r - 我们可以创建一个比 R 中的值多 n 个级别的因子变量子集吗?

r - 使用循环或类似函数包装长代码

C++如何将字符串中的所有 `\`变成 `/`?

android - 使用自定义图片和/或颜色填充 Android 选项卡

r - ggplot : color, geom_point 中的填充和大小

r - 无法在 R : cannot install package 中卸载包

java - 比较带有特殊字符(é、è、...)的单词时忽略变音符号

javascript - 如何用不同的单词替换字符串中的多个相同单词

c - C中的递归形状填充程序