R根据行值将索引列添加到数据框

时间:2014-02-19 04:06:31

标签: r indexing

这是r - How to add row index to a data frame, based on combination of factors

的延续

我尝试使用绿色检查答案复制我认为的预期结果,并且我一直得到的东西超出预期。我确信我正在做一些非常基本的错误,但似乎无法看到它或者我误解了所期望的状态。

原帖中的数据:

temp <- data.frame(
Dim1 = c("A","A","A","A","A","A","B","B"),
Dim2 = c(100,100,100,100,200,200,100,200),
 Value = sample(1:10, 8)
 )

然后我运行了以下代码:temp$indexLength <- ave( 1:nrow(temp), temp$Dim1, factor( temp$Dim2), FUN=function(x) 1:length(x) )

和:temp$indexSeqAlong <- ave( 1:nrow(temp), temp$Dim1, factor( temp$Dim2), FUN=seq_along )

然后我创建了以下内容:temp$indexDesired <- c(1, 1, 1, 1, 2, 2, 3, 3)

......以下面的数据框结束:

  Dim1 Dim2 Value indexLength indexSeqAlong indexDesired
1    A  100     6           1             1            1
2    A  100     2           2             2            1
3    A  100     9           3             3            1
4    A  100     8           4             4            1
5    A  200    10           1             1            2
6    A  200     4           2             2            2
7    B  100     3           1             1            3
8    B  200     5           1             1            4

如果我能弄清楚我没有得到所需的索引 - 并假设代码可扩展到超过2个变量 - 我应该全部设置。提前谢谢!

2 个答案:

答案 0 :(得分:3)

如果您使用data.table,则会有一个“符号”.GRP来记录此信息(一个简单的组计数器)

library(data.table)
DT <- data.table(temp)
DT[, index := .GRP, by = list(Dim1, Dim2)]
DT
#    Dim1 Dim2 Value index
# 1:    A  100    10     1
# 2:    A  100     2     1
# 3:    A  100     9     1
# 4:    A  100     4     1
# 5:    A  200     6     2
# 6:    A  200     1     2
# 7:    B  100     8     3
# 8:    B  200     7     4

答案 1 :(得分:1)

一旦第一个参数中的值被分区,ave就无法“知道”它们已经传递了什么顺序。您需要一种可以查看值更改的方法。 duplicated函数是通用的,并且有一个查看多列的data.frame方法:

temp$indexSeqAlong <-  cumsum(!duplicated(temp[, 1:2]) )
temp

  Dim1 Dim2 Value indexSeqAlong
1    A  100     8             1
2    A  100     2             1
3    A  100     7             1
4    A  100     3             1
5    A  200     5             2
6    A  200     1             2
7    B  100     4             3
8    B  200    10             4

可以扩展到您想要的任意数量的列。