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
4

2 回答 2

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)的列,因为默认情况下它已经完成了所有具有通用名称的列(即var1then 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)))
于 2013-10-07T15:22:20.080 回答
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'))))
于 2013-10-07T15:28:45.720 回答