2017-08-17 83 views
1

我有一個分組的數據集,但基團不具有唯一的標識符,像這樣:分配唯一的ID,根據圖案

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的值是爲了,並且每個重複的'N','S'和'W'組是一個組。

direction的每組值都始終以'N'開始,但並非所有組都有一組完整的'N','S'和'W'行(請參見下面的ID B)。

措辭的另一種說法是:我想爲每組最多3行提供一個唯一的ID,從direction == 'N'開始。

期望的結果是這樣的:

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只有關於 'N' 中的行。

回答

2

你可以用==得到這個結果來標識帶有「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 
+0

尼斯。沒有考慮'cumsum'。聰明。 – Balter

+0

@Imo,我不能相信你用一行代碼解決了這個問題。但是,你能解釋一下'cumsum'在這裏工作的方式嗎?我讀了它的文檔,仍然無法理解這一點。謝謝! – holastello

+0

@holastello我添加了一些文字的解釋。也許,看看發生了什麼的最好方法是分階段嘗試代碼。首先,'x $ direction ==「N」'然後'cumsum(x $ direction ==「N」)''。這個結果被作爲索引提供給'LETTERS',一個存儲的向量。 – lmo

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 

如果發生這種情況。