这是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个变量 - 我应该全部设置。提前谢谢!
答案 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
可以扩展到您想要的任意数量的列。