首页 > 解决方案 > 如何用以前的状态替换单个出现

问题描述

我有一个如下的数据表:

table=data.table(x=c(1:15),y=c(1,1,1,3,1,1,2,1,2,2,3,3,3,3,3),z=c(1:15)*3)

我必须清理这个数据表,其中有单个出现,例如 1 之间的 3 和 2 之间的 1。它不必是 3,但任何只出现一次的数字都应替换为前一个数字。

table=data.table(x=c(1:15),y=c(1,1,1,1,1,1,2,2,2,2,3,3,3,3,3),z=c(1:15)*3)

这是预期的数据表。

任何帮助表示赞赏。

标签: rdplyrdata.table

解决方案


这是一种方法:

library(data.table)
#Count number of rows for each group
table[, N := .N, rleid(y)]
#Change `y` value which have only one row
table[, y := replace(y, N ==1, NA)]
#Replace NA with last non-NA value
table[, y := zoo::na.locf(y)][, N := NULL]

table
#     x y  z
# 1:  1 1  3
# 2:  2 1  6
# 3:  3 1  9
# 4:  4 1 12
# 5:  5 1 15
# 6:  6 1 18
# 7:  7 2 21
# 8:  8 2 24
# 9:  9 2 27
#10: 10 2 30
#11: 11 3 33
#12: 12 3 36
#13: 13 3 39
#14: 14 3 42
#15: 15 3 45

推荐阅读