我有一个很长的时间序列,我需要识别和标记重复值的序列。这是一些数据:
DATETIME WDIR
1 40360.04 22
2 40360.08 23
3 40360.12 126
4 40360.17 126
5 40360.21 126
6 40360.25 126
7 40360.29 25
8 40360.33 26
9 40360.38 132
10 40360.42 132
11 40360.46 132
12 40360.50 30
13 40360.54 132
14 40360.58 35
因此,如果我需要注意一个值重复三次或更多次,我有一个四个'126'的序列和一个需要标记的三个'132'的序列。
我是R的新手。我希望我使用cbind在这个数组中创建一个新列,相应的行中有一个“T”,但如何正确填充列是一个谜。有什么指针吗?非常感谢。
答案 0 :(得分:10)
正如Ramnath所说,你可以使用rle
。
rle(dat$WDIR)
Run Length Encoding
lengths: int [1:9] 1 1 4 1 1 3 1 1 1
values : int [1:9] 22 23 126 25 26 132 30 132 35
rle
返回一个包含两个组件,长度和值的对象。我们可以使用长度块来构建一个新列,用于标识哪些值重复超过三次。
tmp <- rle(dat$WDIR)
rep(tmp$lengths >= 3,times = tmp$lengths)
[1] FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE
这将是我们的新专栏。
newCol <- rep(tmp$lengths > 1,times = tmp$lengths)
cbind(dat,newCol)
DATETIME WDIR newCol
1 40360.04 22 FALSE
2 40360.08 23 FALSE
3 40360.12 126 TRUE
4 40360.17 126 TRUE
5 40360.21 126 TRUE
6 40360.25 126 TRUE
7 40360.29 25 FALSE
8 40360.33 26 FALSE
9 40360.38 132 TRUE
10 40360.42 132 TRUE
11 40360.46 132 TRUE
12 40360.50 30 FALSE
13 40360.54 132 FALSE
14 40360.58 35 FALSE
答案 1 :(得分:7)
使用rle
来完成工作!这是一个惊人的函数,可以计算序列中连续重复数字的次数。下面是一些示例代码,介绍如何使用rle
标记数据中的不法分子。这将返回数据帧中具有连续重复3次或更多次的WDIR的所有行。
runs = rle(mydf$WDIR)
subset(mydf, WDIR %in% runs$values[runs$lengths >= 3])
答案 2 :(得分:1)
两种选择。
假设数据已加载:
dat <- read.table(textConnection("
DATETIME WDIR
40360.04 22
40360.08 23
40360.12 126
40360.17 126
40360.21 126
40360.25 126
40360.29 25
40360.33 26
40360.38 132
40360.42 132
40360.46 132
40360.50 30
40360.54 132
40360.58 35"), header=T)
选项1 :排序
dat <- dat[order(dat$WDIR),] # needed for the 'repeats' to be pasted into the correct rows in next step
dat$count <- rep(table(dat$WDIR),table(dat$WDIR))
dat$more4 <- ifelse(dat$count < 4, F, T)
dat <- dat[order(dat$DATETIME),] # sort back to original order
dat
选项2 :Oneliner
dat$more4 <- ifelse(dat$WDIR %in% names(which(table(dat$WDIR)>3)),T,F)
dat
我认为作为一个新用户,选项1可能是一个更简单的逐步方法,尽管rep(table(), table())
最初可能不直观。