2014-02-19 3 views
2

Это продолжение r - How to add row index to a data frame, based on combination of factorsR добавить столбец индекса в кадр данных на основе ряда значений

Я попытался повторить то, что я считаю желаемые результаты, используя зеленый проверили ответ, и я постоянно получаю что-то другое, чем ожидалось. Я уверен, что я делаю что-то действительно неправильное, но, похоже, не вижу его ИЛИ я неправильно понял, что это за состояние.

Данные из оригинального поста:

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 

Если я могу понять, что я не получаю нужного индекса, и если код расширяется до более чем двух переменных - я должен быть установлен. Заранее спасибо!

+0

Вы уверены, что последнее значение 'indexDesired' не должно быть' 4'? – thelatemail

+0

@thelatemail Я уверен, что ДОЛЖЕН быть! Спасибо за уловку – user2621147

+0

@IShouldBuyABoat Я был бы рад поделиться небольшим фрагментом данных, который показывает соответствующие результаты двух подходов, предложенных ниже. Тем не менее, я не могу найти никакого направления, как правильно вводить данные в SO-вопросы, и я делаю много дополнительной работы для модов. Когда я это выясню, я поставлю сравнение. – user2621147

ответ

2

Если вы используете 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 
+0

Что относительно кадра данных? –

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 

является расширяемым столько столбцов, сколько вы хотите.

Смежные вопросы