2014-12-19 47 views
1

這是一個小的數據集一個簡單的任務,但我有幾百萬的觀察,所以我需要一個非常快的替代品。[R取決於對大數據的其他變量創建索引設置

我想創建索引標識對α-β的。 Alpha-beta總是成對的。用這個創建一個循環很容易,但是我發現R停止需要很長時間。任何人都知道大數據集的快速解決方案來創建下面的右列?

id var1 var2 index 
A 2 alpha 1 
A 3 beta 1 
B 5 alpha 2 
B 6 beta 2 
B 4 alpha 3 
B 7 beta 3 
C 3 alpha 4 
C 5 beta 4 
D 4 alpha 5 
D 8 beta 5 

數據樣本:

df <- structure(list(id = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 
4L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"), var1 = c(2L, 
3L, 5L, 6L, 4L, 7L, 3L, 5L, 4L, 8L), var2 = structure(c(1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("alpha", "beta"), class = "factor")), .Names = c("id", 
"var1", "var2"), row.names = c(NA, -10L), class = "data.frame") 

回答

2

如果列已經訂購

library(data.table) 
setDT(df)[, indx:= cumsum(var2=='alpha')] 
df 
# id var1 var2 indx 
#1: A 2 alpha 1 
#2: A 3 beta 1 
#3: B 5 alpha 2 
#4: B 6 beta 2 
#5: B 4 alpha 3 
#6: B 7 beta 3 
#7: C 3 alpha 4 
#8: C 5 beta 4 
#9: D 4 alpha 5 
#10: D 8 beta 5 
1

另一種可能性是使用重複。缺點是var2必須只包含Alpha-Beta對,任何發生缺失值或其他任何情況,並且此方法可能失敗:

df$index <- rep(1:(length(df$var2)/2), each = 2)