基于多变量创建索引

时间:2013-10-07 15:11:23

标签: r date indexing

我正在研究在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

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

上述两种技术都要求您的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

我天堂没有提供连接的列(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'))))