根据模式

时间:2017-08-17 16:59:40

标签: r

我有一个分组数据集,但这些组没有唯一标识符,如下所示:

direction <- c('N','S','W','N','N','S','W','N','S','W')
measurement <- c(4,6,1,7,2,4,7,4,1,4)
x <- data.frame(direction, measurement)
x
   direction measurement
1          N           4
2          S           6
3          W           1
4          N           7
5          N           2
6          S           4
7          W           7
8          N           4
9          S           1
10         W           4

x中,direction的值按顺序排列,每个重复的“&#39; N&#39;&#39; S&#39;和&#39; W&#39;是一个小组。

direction的每组值始终以&#39; N&#39;开头,然而,并非所有群组都有一套完整的&#39; N&#39;&#39; S&#39;和&#39; W&#39;行(请参阅下面的ID B)。

另一种表达方式:我想从direction == 'N'开始为每组最多3行提供唯一ID。

期望的结果是:

    direction measurement ID
1          N            4  A
2          S            6  A
3          W            1  A
4          N            7  B
5          N            2  C
6          S            4  C
7          W            7  C
8          N            4  D
9          S            1  D
10         W            4  D

请注意,ID B只有一行&#39; N&#39;。

2 个答案:

答案 0 :(得分:3)

您可以使用==获取此结果,以识别带有“N”和cumsum的元素来构建索引。然后按照balter的答案中的建议,从存储的矢量LETTERS中拉出值。

这里,cumsum对逻辑向量求和,将其强制转换为数字二进制(1s和0s)。因此,在遇到“N”时,它会重复相同的值并递增。

 x$ID <- LETTERS[cumsum(x$direction == "N")]

返回

x
   direction measurement ID
1          N           4  A
2          S           6  A
3          W           1  A
4          N           7  B
5          N           2  C
6          S           4  C
7          W           7  C
8          N           4  D
9          S           1  D
10         W           4  D

答案 1 :(得分:2)

我认为这应该有效:

direction <- c('N','S','W','N','N','S','W','N','S','W')
measurement <- c(4,6,1,7,2,4,7,4,1,4)
x <- data.frame(direction, measurement)

inds <- which(direction == 'N')
diffs <- diff(c(inds, length(direction)+1))

groups <- rep(seq_along(inds),diffs)

x$ID <- LETTERS[groups]
x

请注意,如果您有超过26个组,LETTERS[]将开始返回NA。您可以随时使用:

x$ID <- groups

如果发生这种情况。