我正在研究在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
答案 0 :(得分: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
上述两种技术都要求您的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
我天堂没有提供连接的列(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)
您可以使用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'))))