Чтобы расширить мой комментарий, группировки могут быть произвольными, вам просто нужно переделать его в правильное упорядочение. Есть несколько способов сделать это, @akrun показал, что это можно сделать с помощью функции match
, или вы можете использовать функцию as.numeric
, если это проще понять для себя.
df <- data.frame(x=c(1,1,2,2,2,3,3,4,5,6,6,6,9,9),y=c(1,2,3,4,6,3,7,8,6,4,3,7,3,2))
# these are equivalent
df$newx <- as.numeric(factor(df$x, levels=unique(df$x)))
df$newx <- match(df$x, unique(df$x))
Поскольку теперь у вас есть «новый» releveling который является последовательным, мы можем использовать логику, которая обсуждалась в комментариях.
df$newNumber <- 1:nrow(df) + (df$newx-1)*2
Для этого примера, это приведет к следующему dataframe:
x y newx newNumber
1 1 1 1
1 2 1 2
2 3 2 5
2 4 2 6
2 6 2 7
3 3 3 10
3 7 3 11
4 8 4 14
5 6 5 17
6 4 6 20
6 3 6 21
6 7 6 22
9 3 7 25
9 2 7 26
где df$newNumber
является вывод, который вы хотели.
Чтобы создать последовательность 0,0,4,4,4,9,...
, в основном то, что вы делаете, принимая минимум каждой группы и вычитания 1
. Самый простой способ сделать это - использовать library(dplyr)
.
library(dplyr)
df %>%
group_by(x) %>%
mutate(newNumber2 = min(newNumber) -1)
Какой будет иметь выход:
Source: local data frame [14 x 5]
Groups: x
x y newx newNumber newNumber2
1 1 1 1 1 0
2 1 2 1 2 0
3 2 3 2 5 4
4 2 4 2 6 4
5 2 6 2 7 4
6 3 3 3 10 9
7 3 7 3 11 9
8 4 8 4 14 13
9 5 6 5 17 16
10 6 4 6 20 19
11 6 3 6 21 19
12 6 7 6 22 19
13 9 3 7 25 24
14 9 2 7 26 24
Если они сгруппированы уже, и маркированы так, как вы показали, не могли бы вы просто запустить его как 'ф.р. $ rowname <- 1 : dim (df) [1]; df $ newNumber <- df $ rowname + (df $ x-1) * 2', а 'df $ newNumber' - желаемый результат? – chappers
@chappers благодарит за идею, однако я ищу общее решение, я просто понял, что мой x является последовательным, что может быть разрешено этим, но x действительно может быть любым значением – xyy
Расширение идеи @chappers, 'library (Таблица данных); setDT (df) [, gr: = .GRP, x] [, 1: .N + (gr-1) * 2] # [1] 1 2 5 6 7 10 11 14 17 20 21 22 25 26' – akrun