2014-02-19 140 views
2

這是r - How to add row index to a data frame, based on combination of factorsr添加索引列基於行的數據幀值

延續我試圖複製我所相信的是使用綠色覈對答案,我一直讓其他比預期的東西所期望的結果。我確信我正在做一些非常基本的錯誤,但似乎無法看到它,或者我誤解了期望的狀態。

從原帖中的數據:

temp <- data.frame(
Dim1 = c("A","A","A","A","A","A","B","B"), 
Dim2 = c(100,100,100,100,200,200,100,200), 
Value = sample(1:10, 8) 
) 

然後,我跑到下面的代碼:temp$indexLength <- ave(1:nrow(temp), temp$Dim1, factor(temp$Dim2), FUN=function(x) 1:length(x))

和:temp$indexSeqAlong <- ave(1:nrow(temp), temp$Dim1, factor(temp$Dim2), FUN=seq_along)

,然後我創建了以下內容:temp$indexDesired <- c(1, 1, 1, 1, 2, 2, 3, 3)

。 ..結束以下數據框:

Dim1 Dim2 Value indexLength indexSeqAlong indexDesired 
1 A 100  6   1    1   1 
2 A 100  2   2    2   1 
3 A 100  9   3    3   1 
4 A 100  8   4    4   1 
5 A 200 10   1    1   2 
6 A 200  4   2    2   2 
7 B 100  3   1    1   3 
8 B 200  5   1    1   4 

如果我能弄清楚我沒有得到所需的索引 - 並假設代碼可擴展到2個以上的變量 - 我應該全部設置。提前致謝!

+0

你肯定在'indexDesired'不應該是最後一個值'4'? – thelatemail

+0

@thelatemail我相信它應該是!感謝您的支持 – user2621147

+0

@IShouldBuyABoat我很樂意分享一小段數據,顯示下面提出的兩種方法的相應結果。然而,我似乎無法找到如何正確輸入數據到SO問題的任何方向,並且爲MOD做了大量額外的工作。當我弄清楚的時候,我會把比較起來。 – user2621147

回答

2

如果使用data.table,有一個「符號」 .GRP它記錄該信息(一個簡單的組計數器)

library(data.table) 
DT <- data.table(temp) 
DT[, index := .GRP, by = list(Dim1, Dim2)] 
DT 
# Dim1 Dim2 Value index 
# 1: A 100 10  1 
# 2: A 100  2  1 
# 3: A 100  9  1 
# 4: A 100  4  1 
# 5: A 200  6  2 
# 6: A 200  1  2 
# 7: B 100  8  3 
# 8: B 200  7  4 
+0

數據框怎麼樣? – 2016-02-26 15:25:21

1

一旦第一個參數中的值已被分區,大道就不會「知道」它們傳遞的順序。你需要一個可以查看數值變化的方法。該duplicated功能是通用的,有data.frame方法,着眼於多列:

temp$indexSeqAlong <- cumsum(!duplicated(temp[, 1:2])) 
temp 

    Dim1 Dim2 Value indexSeqAlong 
1 A 100  8    1 
2 A 100  2    1 
3 A 100  7    1 
4 A 100  3    1 
5 A 200  5    2 
6 A 200  1    2 
7 B 100  4    3 
8 B 200 10    4 

,你想要的是可擴展爲多列。

相關問題