r-如何将单个事件替换为以前的状态



我有一个如下的数据表:

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)

这是预期的数据表。

感谢您的帮助。

这里有一种方法:

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

这是一个基本的R选项

inds <- which(diff(c(head(table$y,1),table$y))*diff(c(table$y,tail(table$y,1)))<0)
table$y <- replace(table$y,inds,table$y[inds-1])

使得

> 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

最新更新