其他人给了我一个看起来有点像这样的数据集。
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/