我有一个分组数据集,但这些组没有唯一标识符,如下所示:
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;。
答案 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
如果发生这种情况。