2013-10-07 151 views
2

我正在研究在R中創建索引,但還沒有找到相當我正在尋找索引的多個變量。當變量1改變時,我希望它重置。我試過FinalTableMBA$index <- as.numeric(seq_along(FinalTableMBA$Column_2)),但似乎無法弄清楚如何在第二個變量中添加索引重置。基於多個變量創建索引

任何幫助將不勝感激!

例如,我希望能做到以下幾點:

Column 1  Column 2 Index 
10/1/2013 10/1/2013  1 
10/1/2013 10/2/2013  2..... 
10/1/2013 10/30/2013 30 
11/1/2013 11/1/2013  1 
11/1/2013 11/2/2013  2 
+1

您能否澄清一下您對「索引」的含義?你想對行進行編號,但是當「列1」的值發生變化時從1開始重新編號? – Backlin

+0

查看'?diff'並查看'data.table'包 –

回答

1

可以使用by第一列分割你的數據和應用此棘手的功能,每一個分裂組:

dat$Index <- unlist(by(dat$Column2,dat$Column1,function(x) 
     as.integer(as.factor(as.character(x))))) 
Column1 Column2 Index 
1 10/1/2013 10/1/2013  1 
2 10/1/2013 10/2/2013  2 
3 10/1/2013 10/30/2013  3 
4 11/1/2013 11/1/2013  1 
5 11/1/2013 11/2/2013  2 

但我覺得這是更好地你COLUMN2格式化爲普通日期和使用它format(x,'%d')

dat$Index <- unlist(by(dat$Column2,dat$Column1,function(x) 
     as.numeric(format(as.Date(x,format='%m/%d/%Y'),'%d')))) 
+1

'by'似乎被強制在這裏..它本質上是'tapply'的包裝,在這裏你只需要'tapply'。那麼爲什麼使用?特別是如果你通過(vector1,vector2,fun)''以'tapply'方式使用它''。它的便利在於提供多個'INDICES'。那時候,我只是移動到'data.table' ... – nigmastar

+0

@nigmastar你錯過了這裏的主要難點。分組是第二個問題,你可以使用'tapply','''''plyr'或'data.table'(即使我需要性能,我也會採用)。這裏的主要問題是獲得每個組的唯一索引。 – agstudy

+1

是的,這就是爲什麼我使用'unique'和then merge'(更優雅)添加方法的原因,並且在我的回答結尾處添加了'tapply' +'as.numeric(factor(x))'。他們都確保'var1'和'var2'的每個獨特組合都有相同的'id' – Michele

3

在基地R這樣做的工作:

> df <- data.frame(var1=rep(c("A","B"), each=5), var2=LETTERS[1:5]) 
> head(df) 
    var1 var2 
1  A A 
2  A B 
3  A C 
4  A D 
5  A E 
6  B A 
> df$id<-unlist(tapply(df$var2, df$var1, seq_along)) 
> head(df) 
    var1 var2 id 
1  A A 1 
2  A B 2 
3  A C 3 
4  A D 4 
5  A E 5 
6  B A 1 

使用data.table代替:

library(data.table) 

> dt <- data.table(var1=rep(c("A","B"), each=5), var2=LETTERS[1:5]) 
> dt[, id:=seq_along(var2), by=var1] 
> head(dt) 
    var1 var2 id 
1: A A 1 
2: A B 2 
3: A C 3 
4: A D 4 
5: A E 5 
6: B A 1 

無論是上述技術需要您的var1var2不是有任何重複值。如果發生這種情況,你可以做到以上對你df(保存這些不同的值到tmp),然後加入結果原始表不同的值:

> df <- data.frame(var1=rep(c("A","B"), each=5), var2=LETTERS[1:5]) 
> df <- rbind(df, df) 
> df <- df[ order(df$var1, df$var2),] 
> head(df) 
    var1 var2 
1  A A 
11 A A 
2  A B 
12 A B 
3  A C 
13 A C 
> tmp <- unique(df) 
> head(tmp) 
    var1 var2 
1  A A 
2  A B 
3  A C 
4  A D 
5  A E 
6  B A 
> tmp$id<-unlist(tapply(tmp$var2, tmp$var1, seq_along)) 
> head(tmp) 
    var1 var2 id 
1  A A 1 
2  A B 2 
3  A C 3 
4  A D 4 
5  A E 5 
6  B A 1 
> df <- merge(df, tmp) 
> head(df,10) 
    var1 var2 id 
1  A A 1 
2  A A 1 
3  A B 2 
4  A B 2 
5  A C 3 
6  A C 3 
7  A D 4 
8  A D 4 
9  A E 5 
10 A E 5 

我heaven't提供通過其列加入(在R合併)原因默認情況下它是通過所有具有共同名稱的人(即var1然後var2)完成的。如果你需要指定:

merge(df, tmp, by=c("var1","var2")) # if the have same col names 

merge(x=df, y=tmp, by.x=c("var1","var2"), by.y=c("var1","var2")) # if they don't. (not needed here) 

或者,(剛纔想),而無需使用任何連接:

df$id <- tapply(df$var2, df$var1, function(x) as.numeric(factor(x)))