在基地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
無論是上述技術需要您的var1
和var2
不是有任何重複值。如果發生這種情況,你可以做到以上對你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)))
您能否澄清一下您對「索引」的含義?你想對行進行編號,但是當「列1」的值發生變化時從1開始重新編號? – Backlin
查看'?diff'並查看'data.table'包 –